0

我正在尝试做的事情:我有一些嵌入式 C 代码可以进行一些信号处理。我还有一套 C# 工具。我想使用 C# 代码调用带有一些波形的嵌入式 C 代码来“测试”算法,看看它在想什么/在做什么。

我做了什么:

嵌入式 C 代码:

__declspec (dllexport) void SigInit(int Flag);   
void SigInit(int Flag) {  ... } 

我编译为 Win32 DLL。配置类型为“动态库 (.dll)”,MFC 设置为“使用标准 Windows 库”。我在 Visual Studio 2010 类查看器中“查看”了我的库,一切看起来都不错。

然后在我的 C# 代码中(带有 .NET 4.0 的 VS2010):

public static class ProcessSignals
{

    [DllImport(@"C:\Users\rpease\Desktop\SigLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void SigInit(int Flag);
}

但是每当我尝试运行主程序并调用 ProcessSignals.SigInit(0) 时:

无法在 DLL“C:\Users\rpease\Desktop\SigLibrary.dll”中找到名为“SigInit”的入口点。

我当时认为这是一个名称修改问题,但我认为我已经解决了这个问题。建议表示赞赏。我想我正在遵循以下指南:PInvoke DLL in C# but can't get over this。

谢谢,

罗杰

4

2 回答 2

1

问题是 c++ 编译器重命名函数。将导出的函数声明为

extern "C" {
    __declspec(dllexport) void SigInit(int Flag);
}

或者

使用depends.exe查看函数的实际导出名称,并EntrypointDllImport属性中设置。

于 2013-05-07T15:21:56.173 回答
1

打开 Visual Studio 命令提示符并将目录更改为包含相关 DLL 的文件夹,然后运行:

dumpbin <nameOfDll> /exports

<nameOfDll>您的 DLL 文件的文件名在哪里,不带尖括号)

然后,您是否看到列出了您期望的函数的名称?

于 2013-05-07T15:20:22.680 回答