我已经建立了一个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误解的方式没有这样简单的事情。尝试实现这两个InstallPPPConnect如无操作(只是让他们返回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来验证哪些方法可用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top