2009-04-21 1 views
1

내가 관리되지 않는 C에서 .NET 메소드를 호출 탐험하고 ++ 코드를 C++ DLL을 통해 호출하고 How To Inject a Managed .NET Assembly (DLL) Into Another Process번에 전화했을 때

void StartTheDotNetRuntime() 
{ 
    // Bind to the CLR runtime.. 
    ICLRRuntimeHost *pClrHost = NULL; 
    HRESULT hr = CorBindToRuntimeEx(
     NULL, L"wks", 0, CLSID_CLRRuntimeHost, 
     IID_ICLRRuntimeHost, (PVOID*)&pClrHost); 

    // Push the CLR start button 
    hr = pClrHost->Start(); 

    // Okay, the CLR is up and running in this (previously native) process. 
    // Now call a method on our managed class library. 
    DWORD dwRet = 0; 
    hr = pClrHost->ExecuteInDefaultAppDomain(
     L"c:\\PathToYourManagedAssembly\\MyManagedAssembly.dll", 
     L"MyNamespace.MyClass", L"MyMethod", L"MyParameter", &dwRet); 

    // Stop the CLR runtime 
    hr = pClrHost->Stop(); 

    // Don't forget to clean up. 
    pClrHost->Release(); 
} 

이 문제없이 작동에 아래의 기능을 발견 할 때 닷 넷 호스팅 기능을 분할하는 방법 콘솔 응용 프로그램.

지금은 논리적으로이 세 부분

Method - DLLMain 
    DLL_PROCESS_ATTACH 
     Bind to the CLR runtime 
     Push the CLR start button 

    DLL_PROCESS_DETACH 
     Stop the CLR runtime 
     Do not forget to clean up. 

Method - CallDotNetToDoSomething 

어떻게 내가 이것을 달성하기 위해 ICLRRuntimeHost pClrHost/HRESULT의 시간을 선언 할에 있어야하는 DLL 내에서 사용하기 위해이 기능을 분할 할?

답변

1

전역 변수 (정적)이거나 일종의 싱글 톤이어야합니다. 프로세스 당 하나의 .NET 런타임 만 허용됩니다 (요즘은 요즘). 그래서 훨씬 더 영리 해 지려고 노력하는 데는 거의 의미가 없습니다. DLL로드에서 전역을 채운 다음 DLL 언로드 중에 전역에 채우십시오.

.NET/Mono 포함 프로젝트의 경우 생성자가 런타임 (예 : 바인딩/푸시 시작 버튼)을 부팅하고 소멸자가 종료 (중지/릴리스) 한 객체를 만들었습니다. 이렇게하면 주 응용 프로그램에서 main()의 스택에 넣거나 DLL로드 중에 new()를 수행하고 DLL 언로드에서 삭제하는 등 기본 응용 프로그램의 작동 방식을 선택할 수 있습니다. 이 경우 포인터는 사용자가 생성 한 새 객체의 인스턴스 변수가됩니다. ClrEmbedManager. 라이브러리가 다른 종류의 응용 프로그램에서 다른 동작으로 재사용 할 필요가 없다면 과도합니다.

+0

.NET 3.5에서 하나의 프로세스 (side-by-side)에서 여러 개의 .NET 런타임을 가질 수 있습니다. 이것이 원래 포스터의 문제에 어떻게 영향을 미치는지 확실하지 않습니다. –