现在的位置: 首页 > 综合 > 正文

c++托管使用c#动态库

2018年02月12日 ⁄ 综合 ⁄ 共 1144字 ⁄ 字号 评论关闭

拿来一个dll,是c#编译的,我在c++程序中需要使用该dll,网上查了相关资料,需要用到 c++托管相关知识,即CLR公共语言时运行环境。具体使用步骤如下:

          1.拷贝dll到工程运行目录下。
    2.引用:
           #using \"..\\debug\\CTest.dll\"
         using namespace CTest;  
         如果 程序中引用了 其他.net组建的程序集,根据提示进行引用。例如缺少:程序集“System.Windows.Forms 则添加 #using <System.Windows.Forms.dll>
     3.项目属性,修改“公共语言运行时支持”为 "/clr".
  4.托管对象使用:
              ClassName ^p = gcnew ClassName();
                p->Fun();  // 调用dll的函数

         //delete p;
               通过gcnew来实例化,无需使用delete来释放内存,gcnew出来的内存由
         虚拟机托管,程序结束后,会自动销毁。

           5.如果dll提供的接口,需要注册回调。则语法和c#注册回调语法一样

  如:

       c#里回调函数定义如下 :
  namespace CTest
  {
  public class ClassName : UserControl
  {
    public ClassName();
    public event ClassName.DataReceive myDataReceive;
    public delegate void DataReceive(int iDoor, string sOPtag);
  }
       }

        则回调设置方法:       

p->myDataReceive += gcnew ClassName::DataReceive(GetAccessMsg); 

    GetAccessMsg 定义如下:

  1. void GetAccessMsg(int iDoor, System::String^ sOPtag))  
  2. {  
  3.     // 把 System::String^ 类型转换成 char*
      
  4.     IntPtr sptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(sOPtag);  
  5.     char* pMsg = (char*)sptr.ToPointer(); cout<<iDoor<<endl; }  

转自:http://blog.csdn.net/chao360559040/article/details/7570307

【上篇】
【下篇】

抱歉!评论已关闭.