c#调用C++写的dll导出类,如何实现

我看你有戏 2009-05-25 11:48:55

网上看了一些都是调用c++写函数

能不能实现c#使用c++写的类

各位高手请赐教
...全文
9351 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujsh8606 2012-08-08
  • 打赏
  • 举报
回复
这个帖子真牛啊
lullaby_ZX 2012-07-04
  • 打赏
  • 举报
回复
微软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的下载链接已经在上面的网页中给出了。

耐心地看看吧,抱着真心想学习的态度,虽然看下来很痛苦,都是英文的。。。。
gjw2012 2012-06-29
  • 打赏
  • 举报
回复
http://hi.baidu.com/daven172/item/94ca33d7649056c71b72b463
要不看看这个先,是调用类的,ATL
tangguangchao0511 2012-06-14
  • 打赏
  • 举报
回复
这个问题困扰我好久了,来看看答案
LindenJavier 2011-11-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/starlee/article/details/2864588

看看这个,我刚找到的
desert241 2011-08-26
  • 打赏
  • 举报
回复
我也要帮你顶一下
yingfengerchi 2011-06-07
  • 打赏
  • 举报
回复
楼主解决没有?解决了就贴一下方法啦。也帮你顶一下~
marjezhang 2011-01-15
  • 打赏
  • 举报
回复
其实这个问题 你要先搞清楚 系统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模型的就很好了
luxu007 2010-06-23
  • 打赏
  • 举报
回复
我也遇到同样的问题,DLL中的C++类,是商家提供的芯片驱动的,在应用程序中,要把该类对象化,才能使用。如何在C#应用程序中,调用该类,并对象化呢。
vc_333 2010-06-05
  • 打赏
  • 举报
回复
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
{
/// <summary>
/// ClassA 的摘要说明。
/// </summary>
public class ClassA
{
public ClassA()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public int Add(int a, int b)
{
return a+b;
}
}
}


vc_333 2010-06-05
  • 打赏
  • 举报
回复
看看这个
http://topic.csdn.net/u/20090430/17/5148f3de-9f7d-45b1-b5ba-2fcaf06baafc.html
比较有意思
呵呵~~
vc_333 2010-06-05
  • 打赏
  • 举报
回复
不通过托管C++封装的方法当然有了
你以为微软是吃白饭的呀
上网搜搜Reflection类的用法就知道了
不过呢,执行效率可能只有用C++重新封装的1/3甚至更慢;
呵呵~~
若果实在没办法就给我发E-mail:vc1110@163.com
我可以给你提供一些C#调用C++写的非托管dll里的类的代码(包含继承,重载)

我的上网条件不怎么好,一般可能周六才有时间 呵呵~~
MSDNTXZ 2010-05-26
  • 打赏
  • 举报
回复
同问,有没有不通过托管C++封装就能实现的方法?
kingcs1013 2010-04-15
  • 打赏
  • 举报
回复
http://hi.baidu.com/linzi1128/blog/item/dda5371fa7fa40cea6866946.html 这个好像是 不过 我还没成功 先Up了
qian_gr 2010-03-29
  • 打赏
  • 举报
回复
你需要用managed c++写一个wrapper类,然后c#调用这个wrapper类
GISERzp 2009-12-01
  • 打赏
  • 举报
回复
看来只有通过GET,SET方法封装成员变量了
GISERzp 2009-12-01
  • 打赏
  • 举报
回复
是想调用类的成员变量吧
zhangshuihua2007 2009-09-29
  • 打赏
  • 举报
回复
我也遇到了,只是我用P/Invoke而已!
henry827 2009-08-18
  • 打赏
  • 举报
回复
不知楼主研究出来没有,我也遇到这个问题.
从网上查到的资料说是加载kernal32这个dll,然后用委托的方式加载C++的LoadLibrary,GetProcAddress,FreeLibrary这几个函数.目前正在研究,如果楼主有什么心得希望一起讨论下henry827@163.com
加载更多回复(54)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧