http://www.debugease.com/csharp/550953.html
最近一个项目需要用C#调用非托管C++DLL中的函数接口(有生成的DLL文件和Lib文件),C++的函数接口的参数中使用了Vector<CPoint>及Vector<m_Struct>结构(m_Struct表示自定义的结构体),参考了网上的一些资料:
1、如果直接使用C#调用(http://blog.youkuaiyun.com/pansiom/archive/2006/01/01/568096.aspx)的话,没办法解决Vector的问题;有没有可行性?由于只是调用其中一个核心接口函数,如果可行的话,会省很多事,给出可行的代码。2、是不是只能使用C++/CLI来对非托管DLL进行包装再调用,这个应该肯定能够实现,因为没有接触过C++/CLR,请教具体的实现流程!(由于只需要封装一个接口函数,工作量应该不大)已有Function.dll和Function.lib两个文件,m_Struct结构体的声明也知道。
具体函数形式如下:
bool Fun(vector<CPoint> &list, bool &flag, int &type, vector<m_Struct> &struct);
输入参数:list,flag
输出参数:list,type,struct
[DllImport("xx.dll", EntryPoint="c++中方法名")]
public static extern void 转化后的C#方法名(bool b, int i);比如在C++类库中有个方法:void CFunction(bool b, int i);
你在C#中调用时,先创建一个类
class CSClass
{
[DllImport("xx.dll", EntryPoint="CFunction")]
public static extern void CSFunction(bool b, int i);
}使用的时候就:CSClass.CSFunction(true, 1);//方法名可以相同,不一定要改
就是用C++把这个函数再次封装一次,把他封装成C#可以很方便调用的定义格式。
public static extern void 转化后的C#方法名(bool b, int i);比如在C++类库中有个方法:void CFunction(bool b, int i);
你在C#中调用时,先创建一个类
class CSClass
{
[DllImport("xx.dll", EntryPoint="CFunction")]
public static extern void CSFunction(bool b, int i);
}使用的时候就:CSClass.CSFunction(true, 1);//方法名可以相同,不一定要改”这种基本数据结构(你给的例子只涉及bool和int数据)我知道,关键是传递的参数中含有Vector以及自定义Struct类型数据时如何来做?
就是用C++把这个函数再次封装一次,把他封装成C#可以很方便调用的定义格式。”你所指的应该还是利用C++/CLI来做吧~能否给出代码呢?
首先分享下经验
1,文件头一定要有using System.Runtime.InteropServices;
2,不要使用添加引用的方式,使用DllImport方式加载
3,确保dll和应用程序都在同一个目录,且加载名称正确
4,确保接口函数的参数转换正确,你最好贴出C语言的dll接口,或者使用工具查看下dll接口如果以上你确保正确的话,我可以确保你应该是可以正常调用的。
[DllImport(".dll")]
public static extern bool Fun(ref <CPoint> list, ref bool flag, out int type, out list<m_Struct> struct);