C#调用非托管C++DLL中的函数

来源:互联网 发布:吉视传媒网络宽带连接 编辑:程序博客网 时间:2024/05/17 00:51

http://www.debugease.com/csharp/550953.html

最近一个项目需要用C#调用非托管C++DLL中的函数接口(有生成的DLL文件和Lib文件),C++的函数接口的参数中使用了Vector<CPoint>及Vector<m_Struct>结构(m_Struct表示自定义的结构体),参考了网上的一些资料:

1、如果直接使用C#调用(http://blog.csdn.net/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

解决方案 »

  1. 既然是已有,那就再用 C++ 写个 dll 转换接口,把所有接口用到的高级数据结构转换成基本数据结构,然后才能和 C# 沟通。
      

  2. 我有的只是生成的DLL和Lib文件,没有源代码。但是接口函数中涉及到的结构体声明知道,你所指的用C++写个转换接口是在源文件中写还是用C++/CLI写呢?能不能给出代码参考。
      


  3. [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);//方法名可以相同,不一定要改
      

  4. http://blog.csdn.net/lucky_yyx/archive/2007/04/28/1588188.aspx
      

  5. 利用DLL和Lib文件就可以用C++再次封装了,
    就是用C++把这个函数再次封装一次,把他封装成C#可以很方便调用的定义格式。
      

  6. “[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);//方法名可以相同,不一定要改”这种基本数据结构(你给的例子只涉及bool和int数据)我知道,关键是传递的参数中含有Vector以及自定义Struct类型数据时如何来做?
      

  7. “利用DLL和Lib文件就可以用C++再次封装了,
    就是用C++把这个函数再次封装一次,把他封装成C#可以很方便调用的定义格式。”你所指的应该还是利用C++/CLI来做吧~能否给出代码呢?
      

  8. 本人最近也正在做些使用C#调用C++编写的dll.
    首先分享下经验
    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);
      

  9. 用纯 C++ (不是 C++/CLI )再写个 dll ,封装原来的 dll ,把高级的 vector 转成低级的数组,就这么简单。