使用来自 C# 的托管 C++ dll

Posted

技术标签:

【中文标题】使用来自 C# 的托管 C++ dll【英文标题】:Using managed C++ dll from C# 【发布时间】:2009-02-02 16:01:07 【问题描述】:

我使用托管 C++ 创建了一个 dll。现在我正在尝试从 C# 中使用它。我已将对象添加到项目引用中。对象浏览器正确显示dll中的对象,对象浏览器中dll的路径与实际路径相对应。

但是,当我运行 C# 程序时,它会报错:

未处理的异常:System.IO.FileNotFoundException:指定的模块可以 找不到。 (HRESULT 异常:0x8007007E)

知道还需要做什么吗?

谢谢。

【问题讨论】:

我们可以在这里看到一些代码吗? 【参考方案1】:

我认为您的托管 C++ 程序集缺少其他程序集或 dll 的引用。

【讨论】:

没错,使用的 dll 之一不在路径上。谢谢。【参考方案2】:

您的托管 C++ 程序集是否有其他依赖项,包括非托管 dll?如果您引用的程序集未能加载依赖项,您将在运行时看到此错误。

【讨论】:

【参考方案3】:

您是否在未安装 VS 的机器上运行发行版应用程序?

我只是问,因为我在这里遇到了类似的问题:Mixed Mode Library and CRT Dependencies - HELP

如果你向下滚动到我的答案,你会看到我所做的对我有帮助。

【讨论】:

【参考方案4】:

检查 c++ 程序集是否存在于与您的 c# 程序相同的文件夹中。如果 'Copy Local' 属性设置为 true(在您的 c# 应用程序中对 c++ dll 的引用),它应该被自动复制。

如果存在 c++ dll,最可能的问题是 c++ dll 依赖于另一个无法找到的非托管 dll(即 c# 不会将这些复制到您的应用程序文件夹,因为它不知道非托管引用) .您可以在 c++ dll 上使用DependencyWalker 来检查缺少的依赖项。

另一个可能的原因是您的 MSVC 运行时 dll 有问题。查看 DependencyWalker 是否抱怨缺少 MSVCR*.dll、MSVCP*.dll 等文件。

【讨论】:

以上是关于使用来自 C# 的托管 C++ dll的主要内容,如果未能解决你的问题,请参考以下文章

C#调用C++编写的DLL(非托管)

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException

编写用于 C# 的非托管 C++ DLL

在非托管 C++ DLL 和托管 C# UI 之间发送信息

在 c++ 中为非托管 c# dll 使用 std::string