- 非託管C++代碼調用C#編寫的dll方法
- CLR VIA C#這本書裏面的內容,在網上好像很少關於這方面的內容,貼出來以後留着看。
- C#調用C++編寫的dll,一般都是直接用dllimport,這個資料很多。C++調用C#編寫的dll,一般方法都是先用託管C++將C#的dll進行一次封裝,然後由非託管C++調用封裝好的dll。
- CLR VIA C#在講寄宿和應用程序域的內容時,提供了一個非託管C++直接調用的方法。原理就是,在非託管代碼中手動啓動CLR加載應用程序域來運行託管的dll,從而調用其中的方法。
- 代碼如下:
- #include <Windows.h>
- #include <MSCorEE.h>
- #include <stdio.h>
- #pragma comment(lib,"mscoree.lib")
- int _tmain(int argc, _TCHAR* argv[])
- {
- ICLRRuntimeHost *pClrHost;
- HRESULT hr = CorBindToRuntimeEx(NULL,
- NULL,0,
- CLSID_CLRRuntimeHost,
- IID_ICLRRuntimeHost,
- (PVOID*)&pClrHost);
- //啓動CLR
- pClrHost->Start();
- DWORD retVal=0;
- //將dll加載到默認應用程序域中,並調用其中的方法
- hr = pClrHost->ExecuteInDefaultAppDomain(L"test.dll",L"test.MyType",L"TestMethod",
- L"TestStringParam",&retVal);
- if(S_OK==hr)
- wprintf(L"Managed code returned %d\n",retVal);
- else
- wprintf(L"failed to call csharp dll.\n");
- getchar();
- return 0;
- }
- C#編寫的test.dll如下:
- namespace test
- {
- class MyType
- {
- public static Int32 TestMethod(String s)
- {
- Console.WriteLine("Managed assembly: {0}",s);
- return s.Length;
- }
- }
- }
- 代碼輸出:
- Managed assembly: TestStringParam
- Managed code returned 15
- 可以看到c++成功調用了test.DLL中的方法,並且可以傳入參數和接收返回值。
- 想深入的瞭解,可以看下面的內容:
- http://msdn.microsoft.com/zh-cn/vstudio/9x0wh2z3.aspx