DllImport特性为什么没能找到我自定义的dll呢?

skktuer 2014-02-16 04:58:49
我新建了一个solution,首先建立一个VC的project,是dll的,名字叫做MyLib,里面导出函数:

MYLIB_API void PrintMsg(const char*msg)
{
printf("msg=%s\n",msg);
}

然后在同一个工程当中,我新建一个.net的控制台程序project,主程序如下:

class Program
{
[DllImport("MyLib.dll"]
static extern void PrintMsg(string s);

[STAThread]
static void Main(string[] args)
{
PrintMsg("abc");
}
}

编译没有问题,运行的时候会报错
未经处理的异常: System.DllNotFoundException: 无法加载 DLL“MyLib.dll”: 找不到
指定的模块。 (异常来自 HRESULT:0x8007007E)。
在 UseCom.Program.PrintMsg(String s)
在 UseCom.Program.Main(String[] args) 位置 d:\Users\a\Documents\Visual Studio
2012\Projects\ATLProject1\UseCom\Program.cs:行号 48
请按任意键继续. . .

奇怪了,我都是在同一个solution里面编译的,怎么就找不到dll呢? 于是我找到MyLib.dll存放的地方,把绝对路径写到DllImport这个Attribut里面,然后再编译运行:

[DllImport(@"D:\Users\a\Documents\Visual Studio 2012\Projects\ATLProject1\Debug\MyLib.dll")]

未经处理的异常: System.EntryPointNotFoundException: 无法在 DLL“D:\Users\a\Docu
ments\Visual Studio 2012\Projects\ATLProject1\Debug\MyLib.dll”中找到名为“Print
Msg”的入口点。
在 UseCom.Program.PrintMsg(String s)
在 UseCom.Program.Main(String[] args) 位置 d:\Users\a\Documents\Visual Studio
2012\Projects\ATLProject1\UseCom\Program.cs:行号 48
请按任意键继续. . .

行号48就是PrintMsg("abc")这句。我用的是VS2012。哪位高人帮我解答一下?
...全文
145 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
maomiaomi 2014-02-16
  • 打赏
  • 举报
回复
你在定义PrintMsg的时候需要如此定义
extern "C"  MYLIB_API void PrintMsg(const char*msg)
因为不加上extern "C" 的话PrintMsg会被C++编译器重命名,自然就找不到名为“Print Msg”的入口点了,如果不想或者是其他原因不能增加extern "c"的话,你可以在VS命令提示行下使用 dumpbin /exports dllFileName 命令查看PrintMsg的真正导出名,然后 在C#里就用PrintMsg的真正导出名了
skktuer 2014-02-16
  • 打赏
  • 举报
回复
自己顶一下!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧