C++ 通過DLL調用C#代碼

本文將介紹C++中通過DLL來調用C#代碼。

首先建立C#的“類庫”工程CShapeDLL

然後輸入如下代碼:

[csharp] view plain copy
  1. //C++通過DLL調用C#代碼  
  2. //http://blog.csdn.net/morewindows/article/details/8678431  
  3. //By MoreWindows( http://blog.csdn.net/MoreWindows )  
  4. using System;  
  5. using System.Collections.Generic;  
  6. using System.Linq;  
  7. using System.Text;  
  8. namespace CShapeDLL  
  9. {  
  10.     public class CMyAddClass  
  11.     {  
  12.         private int m_nNumber1;  
  13.         private int m_nNumber2;  
  14.         public int Number1  
  15.         {  
  16.             set { m_nNumber1 = value; }  
  17.             get { return m_nNumber1; }  
  18.         }  
  19.         public int Number2  
  20.         {  
  21.             set { m_nNumber2 = value; }  
  22.             get { return m_nNumber2; }  
  23.         }  
  24.         public int AddFunc()  
  25.         {  
  26.             return m_nNumber1 + m_nNumber2;  
  27.         }  
  28.     }  
  29.   
  30.     public class CMyWriteLine  
  31.     {  
  32.         private string m_strText;  
  33.         public string Text  
  34.         {  
  35.             set { m_strText = value; }  
  36.             get { return Text; }  
  37.         }  
  38.         public void WriteLineFunc()  
  39.         {  
  40.             Console.WriteLine(m_strText);  
  41.         }  
  42.     }  
  43. }  
  44. // By MoreWindows( http://blog.csdn.net/MoreWindows )  

這裏有兩個類,一個是MyAddClass類,是用來做加法運算的,另一個是CMyWriteLine,用來輸出文本的。

然後以C++控制檯程序爲例,C++代碼如下:

[cpp] view plain copy
  1. //C++通過DLL調用C#代碼  
  2. //http://blog.csdn.net/morewindows/article/details/8678431  
  3. #using "CShapeDLL\\CShapeDLL\\bin\\Debug\\CShapeDLL.dll"  
  4. //#using "CShapeDLL\\CShapeDLL\\bin\\Release\\CShapeDLL.dll"  
  5. #include <stdio.h>  
  6. #include <conio.h>  
  7. using namespace CShapeDLL;  
  8. int main()    
  9. {    
  10.     printf("    C++通過DLL調用C#代碼\n");            
  11.     printf(" - By MoreWindows( http://blog.csdn.net/morewindows/article/details/8678431 ) -\n\n");     
  12.   
  13.     CMyWriteLine ^ writeLineClass = gcnew CMyWriteLine;  
  14.     writeLineClass->Text = "使用C# 的CMyWriteLine示範";  
  15.     writeLineClass->WriteLineFunc();  
  16.     writeLineClass->Text = "By MoreWindows (http://blog.csdn.com/MoreWindows)";  
  17.     writeLineClass->WriteLineFunc();  
  18.     writeLineClass->Text = "http://blog.csdn.net/morewindows/article/details/8678431";  
  19.     writeLineClass->WriteLineFunc();  
  20.   
  21.     printf("\n   ----------------------------------   \n");  
  22.   
  23.     CMyAddClass ^ addClass = gcnew CMyAddClass;  
  24.     addClass->Number1 = 3;  
  25.     addClass->Number2 = 5;  
  26.     printf("使用C# 的CMyAddClass示範\n");  
  27.     printf("%d + %d = %d\n", addClass->Number1, addClass->Number2, addClass->AddFunc());  
  28.     getch();  
  29.     return 0;  
  30. }  
  31. //By MoreWindows( http://blog.csdn.net/MoreWindows )  

編譯,出錯。提示如下:

fatal error C1190: 託管目標代碼需要“/clr”選項

好吧,修改下,在“屬性”->“配置屬性”->“常規”->“公共語言運行庫支持”中選取“公共語言運行庫支持(/clr)


再編譯,又出錯!提示如下:

1>正在編譯...

1>cl: 命令行error D8016 :“/MTd”和“/clr”命令行選項不兼容

1>項目: error PRJ0002 : 錯誤的結果2 (從“e:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe”返回)。

好吧,再修改下,“屬性”->“配置屬性”->C/C++->“代碼生成”->“運行時庫”中選取“多線程DLL (/MD)”。



如果出現現下問題

1>------ 已啓動生成: 項目: test, 配置: Debug Win32 ------

1>正在編譯...

1>win321.cpp

1>e:\vs2005\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]


解決方法:右擊項目-->屬性-->配置屬性-->常規,然後在右邊的“項目默認值”中的“MFC的使用”選項中選擇“在共享 DLL 中使用 MFC”


再編譯,成功了。運行下,又出錯了——“應用程序發生異常未知的軟件異常(0xe0434f4d),位置爲 0x7c812fd3“。


這個怎麼解決了,很簡單,這是因爲EXE程序沒能加載到DLL文件導致的,將CShapeDLL.dll拷貝到EXE程序所在目錄下,再運行,成功了。結果如下圖所示(WinXP及Win7均可以運行):


發佈了13 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章