none
C#如何调用这个C++DLL接口 RRS feed

  • 问题

  • 大家好!最近碰到个C#调用C++DLL接口的问题。

    C++方法原型如下:

    int ReadCardIDFromCard(TCHAR szCardId[9])

    C#的封装如下:

    [DllImport("ICCardIF.dll", EntryPoint = "ReadCardIDFromCard")]
    public static extern int ReadCardIDFromCard(Char[] cardNum);

    这样每次运行时都会报错:“无法在 DLL“ICCardIF.dll”中找到名为“ReadCardIDFromCard”的入口点。”

    请知道的帮解决下,先多谢了!!!

    2014年2月14日 7:55

答案

  • 先下载一个exescope工具来打开ICCardIF.dll,看看在DLL中具体的函数名是什么。

    如果在exescope中列出的ICCardIF.dll函数中中找不到

    int ReadCardIDFromCard(TCHAR szCardId[9])

    或者函数名为xxxxReadCardIDFromCardxxxx(xxx为乱码),请检查在C++函数声明时是否有将 extern "C" 添加在 DLL 函数声明之前,如果没有添加则加上extern "C"重新编译即可,比如:

    extern "C" _declspec(dllexport) int ReadCardIDFromCard(TCHAR szCardId[9]);


    • 已编辑 lapheal 2014年2月14日 16:25
    • 已标记为答案 ItStar 2014年2月17日 3:56
    2014年2月14日 16:23
  • 您好!函数的声明前面是加了extern "C" 的但是安装您说的方式我用exescope查看了下ICCardIF.dll里面的函数名称,函数名称前面还是有乱码:
    ?ReadCardIDFromCard@@YAHQAD@Z
    这个是显示的结果。请问这该如何解决啊?????
     

    加个 .def 文件,然后把 ReadCardIDFromCard 写进去。

    • 已标记为答案 ItStar 2014年2月17日 3:56
    2014年2月17日 2:29
  • 多谢大家的帮助现在问题已经解决了!原来的函数声明是使用C++类型的现在改为C类型的声明就解决问题了。我不是做C++开发的这是什么原因我也不太清楚;不过还是要感谢 lapheal、DroidXgnaW 提供的帮助。
    • 已标记为答案 ItStar 2014年2月17日 3:56
    2014年2月17日 3:55

全部回复

  • 您好,你建议的这种方式我也试过;也是同样报哪个错误。
    2014年2月14日 9:01
  • 先下载一个exescope工具来打开ICCardIF.dll,看看在DLL中具体的函数名是什么。

    如果在exescope中列出的ICCardIF.dll函数中中找不到

    int ReadCardIDFromCard(TCHAR szCardId[9])

    或者函数名为xxxxReadCardIDFromCardxxxx(xxx为乱码),请检查在C++函数声明时是否有将 extern "C" 添加在 DLL 函数声明之前,如果没有添加则加上extern "C"重新编译即可,比如:

    extern "C" _declspec(dllexport) int ReadCardIDFromCard(TCHAR szCardId[9]);


    • 已编辑 lapheal 2014年2月14日 16:25
    • 已标记为答案 ItStar 2014年2月17日 3:56
    2014年2月14日 16:23
  • 您好!函数的声明前面是加了extern "C" 的但是安装您说的方式我用exescope查看了下ICCardIF.dll里面的函数名称,函数名称前面还是有乱码:
    ?ReadCardIDFromCard@@YAHQAD@Z
    这个是显示的结果。请问这该如何解决啊?????
     
    2014年2月17日 2:23
  • 您好!函数的声明前面是加了extern "C" 的但是安装您说的方式我用exescope查看了下ICCardIF.dll里面的函数名称,函数名称前面还是有乱码:
    ?ReadCardIDFromCard@@YAHQAD@Z
    这个是显示的结果。请问这该如何解决啊?????
     

    加个 .def 文件,然后把 ReadCardIDFromCard 写进去。

    • 已标记为答案 ItStar 2014年2月17日 3:56
    2014年2月17日 2:29
  • 多谢大家的帮助现在问题已经解决了!原来的函数声明是使用C++类型的现在改为C类型的声明就解决问题了。我不是做C++开发的这是什么原因我也不太清楚;不过还是要感谢 lapheal、DroidXgnaW 提供的帮助。
    • 已标记为答案 ItStar 2014年2月17日 3:56
    2014年2月17日 3:55