非託管C++ 調用 C# 動態庫

 

  1. 非託管C++代碼調用C#編寫的dll方法 
  2.  
  3. CLR VIA C#這本書裏面的內容,在網上好像很少關於這方面的內容,貼出來以後留着看。 
  4.  
  5. C#調用C++編寫的dll,一般都是直接用dllimport,這個資料很多。C++調用C#編寫的dll,一般方法都是先用託管C++將C#的dll進行一次封裝,然後由非託管C++調用封裝好的dll。 
  6.  
  7. CLR VIA C#在講寄宿和應用程序域的內容時,提供了一個非託管C++直接調用的方法。原理就是,在非託管代碼中手動啓動CLR加載應用程序域來運行託管的dll,從而調用其中的方法。 
  8.  
  9. 代碼如下: 
  10.  
  11. #include <Windows.h> 
  12. #include <MSCorEE.h> 
  13. #include <stdio.h> 
  14. #pragma comment(lib,"mscoree.lib") 
  15. int _tmain(int argc, _TCHAR* argv[]) 
  16.     ICLRRuntimeHost *pClrHost; 
  17.     HRESULT hr = CorBindToRuntimeEx(NULL, 
  18.  
  19.     NULL,0, 
  20.  
  21.     CLSID_CLRRuntimeHost, 
  22.  
  23.     IID_ICLRRuntimeHost, 
  24.  
  25.     (PVOID*)&pClrHost); 
  26.  
  27.     //啓動CLR 
  28.     pClrHost->Start(); 
  29.     DWORD retVal=0; 
  30.  
  31.     //將dll加載到默認應用程序域中,並調用其中的方法 
  32.     hr = pClrHost->ExecuteInDefaultAppDomain(L"test.dll",L"test.MyType",L"TestMethod"
  33.         L"TestStringParam",&retVal); 
  34.     if(S_OK==hr) 
  35.         wprintf(L"Managed code returned %d\n",retVal); 
  36.     else 
  37.         wprintf(L"failed to call csharp dll.\n"); 
  38.     getchar(); 
  39.      return 0; 
  40.  
  41. C#編寫的test.dll如下: 
  42.  
  43. namespace test 
  44.     class MyType 
  45.     { 
  46.         public static Int32 TestMethod(String s) 
  47.         { 
  48.             Console.WriteLine("Managed assembly: {0}",s); 
  49.             return s.Length; 
  50.         } 
  51.     } 
  52.  
  53.  
  54. 代碼輸出: 
  55.  
  56. Managed assembly: TestStringParam 
  57. Managed code returned 15 
  58.  
  59. 可以看到c++成功調用了test.DLL中的方法,並且可以傳入參數和接收返回值。 
  60.  
  61. 想深入的瞭解,可以看下面的內容: 
  62.  
  63. http://msdn.microsoft.com/zh-cn/vstudio/9x0wh2z3.aspx 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章