出口能从C++dll C#P/调用
题
我已经建立了一个C++dll,我谨呼吁从C#代码。我能叫一个功能,但其他会引发一个例外时,C#码试图载dll。
这头看起来是这样的:
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
这将产生一个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
我P/引用的声明是这样的:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
呼叫安装返回与没有例外,但当我打电话PPPConnect,我得到一个MissingMethodException-"不能找到一个进入点'PPPConnect'在一个PInvoke DLL'PPPManager.dll'."
我已经试图消除外部和影响指示功能安装宣言》,以便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();
这是我的专业领域,因此任何建议或想法将受到欢迎。
谢谢, 保罗
编辑:事实证明,这个代码做的工作;问题是与最新的dll不是传播到的设备。D'oh!
解决方案
你使用一个。def文件在dll项目出口的那些职能?如果是,删除它,然后再试一次。这只是猜测,因为它看起来像你的出口是不是他们应当做一个外部"C"影响(dllexports).
我尝试了这一点与一个简单的C++dll使用
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
和一个简单的C#应用程序使用你的PInvoke声明 和它的工作的罚款。
当我做了一dumpbin/出口dll我看到:
倾倒的文件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)
注意到出口的名称是不同的,在我的情况。
其他提示
这可能是因为PPPConnect
在得到由OS误解的方式没有这样简单的事情。尝试实现这两个Install
和PPPConnect
如无操作(只是让他们返回TRUE
没有做其他任何事情),看看问题是否解决。如果是这样,请尝试换在他们出口(仍没有-OPS)的顺序,看看问题是联系在一起订购(不太可能)或别的东西。
您也可以使用图形化工具depends
证实什么DLL的导出表的样子,但我怀疑的问题是从那些地方来了。
根据你的描述安装和PPPConnect区别仅在于名称。我猜你只是使用旧版本的.dll与C#应用程序。而不PPPConnect甲一项所定义。
在声明看起来正确(据我可以在不源判断)。
大的信息,但你别说,一切都是为了这里。尝试为Windows安装调试工具和运行:
kd -z \path\to\PPPManager.dll -y \path\to\PPPManager.pdb -c "x pppmodule!*"
,以获得符号表中的一个更好的转储;这是一个瞎炮为好,但你也可以试试:
extern "C"
{
__declspec(dllexport) BOOL Install();
__declspec(dllexport) BOOL PPPConnect();
};
在的情况下__declspec正在做什么奇怪。
使用的Dependency Walker,打开你的DLL来验证哪些方法可用