日期:2014-05-18  浏览次数:21302 次

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

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

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

各位高手请赐教

------解决方案--------------------
可以……
------解决方案--------------------
把类的指针给暴露出来,然后需要用的时候,传回C++的接口函数就可以了。

你根本就不用管这个类在C++里面是怎么定义的,也最好不要知道,如果不得不需要知道的话,那就请重新设计……
------解决方案--------------------
类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管。

然后C++文件里面再定义几个函数,专门用于处理这个类的对像的操作,参数就是类对像的指针。这样你在C#层调用C++的这个函数,并将准备好的类对像的指针传回去就好了。

这种方法,安全,方便,而且……你那些查到的使用C++函数的方法,就可以用得到了。

当然了,暴露出整个C++类的定义也是可以的,不过那样要进行一次全结构定义复制,涉及到类型转换,很麻烦,而且不安全,最好不要这么做。
------解决方案--------------------
P/Invoke?
------解决方案--------------------
再用C++写一个DLL,在这个DLL中导入另一个DLL的导出类,再定义一些导出函数给C#调用。
------解决方案--------------------
探讨
把类的指针给暴露出来,然后需要用的时候,传回C++的接口函数就可以了。

你根本就不用管这个类在C++里面是怎么定义的,也最好不要知道,如果不得不需要知道的话,那就请重新设计……

------解决方案--------------------
LZ,奇迹来了,给分吧。。呵呵

贴上自己写过的东西,主要内容包含:在C++创建DLL,以及使用C++或者C#分别调用DLL中的方法,环境VS2005。

VS2005中很多工程都可以生成DLL,例如atl,mfc,win32等等。选择Win32,步骤如下:
1:新建项目TestDLL,选择win32中的win32控制台应用程序,在“应用程序设置”中,选择“应用程序类型”为DLL,并将下方的附加选项勾上“空项目”,就可以了。 

2:添加一个C++类,这时vs2005会生成TestDLL.h和TestDLL.cpp的文件,在.h文件中,键入如下代码:
#define LIBEXPORT_API extern "C" __declspec(dllexport) 
LIBEXPORT_API int f( char * ch);//这是一个测试程序 

3:然后在.cpp文件中,必须加入DllMain函数以作为程序出口,并实现函数f:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{//程序出口
return TRUE;


//函数的实现在这里
LIBEXPORT_API int f(char * ch)
{
return 88;


4:编译生成,就能得到与项目同名的TestDLL.dll。注意,生成的dll文件在外面的一个debug文件中。

接下来该怎么调用dll,分别在C++和C#做了调用。调用过程如下:
C++调用:
1:首先将dll文件加入工程,拷贝dll置于c++项目文件所在的目录。
2:调用代码
 typedef int (*TEST) (char * ch);//定义调用DLL函数的类型
 //下面是调用过程
 HINSTANCE hDLL; 
 TEST f;
 hDLL = LoadLibrary(_T("TestDLL.dll"));//加载动态链接库TestDLL.dll文件; 
 f = (TEST)GetProcAddress(hDLL,(LPCSTR)"f"); //调用的f函数
 int si ;
 si = f("abc");
FreeLibrary(hDLL);//卸载TestDLL.dll文件;
cout<<si;
 return 0;
3:结果——屏幕返回88,正确地调用了dll中的方法。 

C#调用:
1:将dll文件拷贝至C#执行文件所在目录,一般在/bin/debug目录下;
2:调用代码
 using System.Runtime.InteropServices;
 ... 
 ...
class CallDLL
{//使用一个类封装所有dll的函数
[DllImport("TestDLL.dll", EntryPoint = "f",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]//指定dll访问入口
public static extern int f(string s);//定义调用dll中函数的类型
}
...
//使用dll中的函数
int m = CallDLL.f("mmm");
3:结果m的值正是88,操作成功。


------解决方案--------------------
方法都可以调用了,类的定义道理是一样的


在C++中这样定义你的类
class LIBEXPORT_API YourClass
{
.....
}
------解决方案--------------------
可以调用托管C++类,不能调用非托管C++类
------解决方案--------------------

 添加引用

 [DllImport("XXXX.dll", CharSet = CharSet.Auto)] ''动态链接库
public static extern int XXXX(int XXXX); ''具体方法声明
------解决方案--------------------
没看清楚,