将函数从C++ dll导出到C#P/Invoke

Sym*_*ric 8 c# c++ dll pinvoke dllimport

我已经构建了一个C++ DLL,我想用C#代码调用它.我可以调用一个函数,但是当C#代码尝试加载dll时,另一个抛出异常.

标题看起来像这样:

extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Run Code Online (Sandbox Code Playgroud)

这会产生一个带有轻微混乱的导出表的dll(名称字段中的foo = foo是什么意思?):

File Type: DLL

Section contains the following exports for PPPManager.dll

00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
    0.00 version
       1 ordinal base
       2 number of functions
       2 number of names

ordinal hint RVA      name

      1    0 000078E4 Install = Install
      2    1 000079DC PPPConnect = PPPConnect
Run Code Online (Sandbox Code Playgroud)

我的P/Invoke声明如下所示:

[DllImport("PPPManager.dll")]
private static extern bool Install();

[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
Run Code Online (Sandbox Code Playgroud)

对Install的调用没有异常返回,但是当我调用PPPConnect时,我得到一个MissingMethodException - "在PInvoke DLL'PPPManager.dll'中找不到入口点'PPPConnect'."

我已经尝试从Install函数声明中删除extern和declspec指令,因此PPPConnect是唯一导出的函数,这仍然不允许我调用PPPConnect.

我也试过按顺序做DllImport; 这给出了与按名称调用相同的结果 - 安装返回,但PPPConnect抛出异常"无法找到入口点'#2'...".

互操作日志给出:

[pinvokeimpl][preservesig]
bool  invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();

JIT ERROR FOR PINVOKE METHOD (Managed -> Native): 
[pinvokeimpl][preservesig]
bool  invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
Run Code Online (Sandbox Code Playgroud)

这远远超出了我的专业领域,因此欢迎任何建议或想法.

谢谢,保罗

编辑:事实证明这个代码确实有效; 问题是最新的DLL没有传播到设备.D'哦!

m-s*_*arp 8

您是否在dll项目中使用.def文件来导出这些函数?如果是这样,请将其删除并重试.这只是一个猜测,因为当你做一个extern"C"declspec(dllexports)时,看起来你的输出不是它们应该是的.

我用一个简单的C++ dll尝试了这个

extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Run Code Online (Sandbox Code Playgroud)

和一个简单的C#应用​​程序使用您的PInvoke声明,它工作正常.

当我在dll上执行dumpbin/exports时,我看到:

转储文件PPPManager.dll

文件类型:DLL

部分包含PPPManager.dll的以下导出

00000000 characteristics
499F6C2D time date stamp Fri Feb 20 20:51:25 2009
    0.00 version
       1 ordinal base
       2 number of functions
       2 number of names

ordinal hint RVA      name

      1    0 000110CD Install = @ILT+200(_Install)
      2    1 00011069 PPPConnect = @ILT+100(_PPPConnect)
Run Code Online (Sandbox Code Playgroud)

请注意,导出的名称在我的情况下是不同的.