c#调用C++写的dll导出类

网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教
解决方案 »
类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管。然后C++文件里面再定义几个函数,专门用于处理这个类的对像的操作,参数就是类对像的指针。这样你在C#层调用C++的这个函数,并将准备好的类对像的指针传回去就好了。这种方法,安全,方便,而且……你那些查到的使用C++函数的方法,就可以用得到了。当然了,暴露出整个C++类的定义也是可以的,不过那样要进行一次全结构定义复制,涉及到类型转换,很麻烦,而且不安全,最好不要这么做。
  
再用C++写一个DLL,在这个DLL中导入另一个DLL的导出类,再定义一些导出函数给C#调用。
  
能给出具体的方案,附代码,给满分
可以发到邮箱
[email protected]
抽象的回复,得0分
  

 
我最近也遇到了这个问题。
查了一些资料,据说是要用managed C++把native C++ DLL中的类重新封装一下,保留公共方法,再提供给C#调用。
感觉对于复杂的自定义类,其过程过于繁琐,最后决定继续用native C++开发了。
  

我也遇到了,只是我用P/Invoke而已!
  
看来只有通过GET,SET方法封装成员变量了
  
你需要用managed c++写一个wrapper类,然后c#调用这个wrapper类
  
http://hi.baidu.com/linzi1128/blog/item/dda5371fa7fa40cea6866946.html 这个好像是 不过 我还没成功  先Up了
  
http://hi.baidu.com/linzi1128/blog/item/dda5371fa7fa40cea6866946.html
  
不通过托管C++封装的方法当然有了
你以为微软是吃白饭的呀
上网搜搜Reflection类的用法就知道了
不过呢,执行效率可能只有用C++重新封装的1/3甚至更慢;

  
看看这个
http://topic.csdn.net/u/20090430/17/5148f3de-9f7d-45b1-b5ba-2fcaf06baafc.html
比较有意思

  
http://topic.csdn.net/u/20090430/17/5148f3de-9f7d-45b1-b5ba-2fcaf06baafc.html
http://www.microsoft.com/china/msdn/library/langtool/vcsharp/csharp05162002.mspx 
  http://blog.csdn.net/dragonsuc/archive/2003/06/30/20791.aspx C# code 
try   
  {   
  //動態加載dll文件,   
  string   sDllName   =   ServiceId.Substring(0,ServiceId.IndexOf("."));   
  Assembly   DllAssembly   =   Assembly.Load(sDllName);   
  //執行選定的類別   
  ISDServer.ITransaction   Tx   =   (ISDServer.ITransaction)DllAssembly.CreateInstance(sDllName+".Transaction");   
  return   Tx.Execute((ISDServer.IProcess)this,ServiceId,oType,sParam); 
如下也可以:  
C# code 
  string   DllPath   =   Application.StartupPath   +   @"\someDLL.dll";   
  System.Reflection.Assembly   assmble   =   System.Reflection.Assembly.LoadFile(DllPath);   
    
  Type   tmpType   =   assmble.GetType("someDLL.ClassA");   
  System.Reflection.MethodInfo   tmpM   =   tmpType.GetMethod("Add");   
  object   tmpobj   =   assmble.CreateInstance("someDLL.ClassA");   
  int   i   =   (int)tmpM.Invoke(tmpobj,   new   object[]{2,3});   
    
  ----------ClassA的定义--------------------   
  using   System;   
    
  namespace   someDLL   
  {   
  ///     
  ///   ClassA   的摘要说明。   
  ///  
  

  public   class   ClassA   
  {   
  public   ClassA()   
  {   
  //   
  //   TODO:   在此处添加构造函数逻辑   
  //   
  }   
    
  public   int   Add(int   a,   int   b)   
  {   
  return   a+b;   
  }   
  }   
  }  
  
我也遇到同样的问题,DLL中的C++类,是商家提供的芯片驱动的,在应用程序中,要把该类对象化,才能使用。如何在C#应用程序中,调用该类,并对象化呢。
  
其实这个问题 你要先搞清楚  系统dll(导出函数dll,就是c++直接编译的dll)  和COM的区别
因为c++ 直接编译出来的dll是导出函数的dll(如API系统的dll),其他语言要用的时候一般都是要声明调用的函数的
如:c# 用dllimport后  在extend 声明对应函数的名次(就像用API函数一样);
    vb就是用dlclare声明API的因此这种dll是不建议强行的去调用c++的dll的类,因为编译器的原因,导致生成不一样号码的导出函数(类中的函数也是导出函数模式生成在dll中),这种函数dll在c++内部调用的时候,一般都是还要连接lib文件(导出函数的标号库)因此,要想很好的调用c++的dll中类的话,或者说是调用其他语言所写的dll的话,还是把dll做成COM组件模型进行调用吧,COM就是做这个事情的,
如vb编译的dll就是COM模型的,所以vb的dll调用之前都需要先注册,所以c#调用vb写的dll是很简单的,直接引用就可以了
因此  把c++的dll做成COM模型的就很好了

  
http://blog.csdn.net/starlee/article/details/2864588看看这个,我刚找到的
  
http://hi.baidu.com/daven172/item/94ca33d7649056c71b72b463
要不看看这个先,是调用类的,ATL
  
微软MSDN论坛上的VC++ FAQ里面有个How do I Invoke Native C++ DLL from .NET Code
地址:http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5df04db1-bbc8-4389-b752-802bc84148fe里面一共介绍了4种方法,代码可以到微软的All-In-One Code里面下载,Browser的下载链接已经在上面的网页中给出了。耐心地看看吧,抱着真心想学习的态度,虽然看下来很痛苦,都是英文的。

你可能感兴趣的:(DotNet,C/C++)