非托管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中的方法,并且可以傳入參數和接收返回值。
想深入的了解,可以看下面的內容: