使用 Microsoft Visual C# 2010 Express 加载 DLL

Posted

技术标签:

【中文标题】使用 Microsoft Visual C# 2010 Express 加载 DLL【英文标题】:Loading DLLs with Microsoft Visual C# 2010 Express 【发布时间】:2012-10-14 20:36:59 【问题描述】:

我正在使用 Microsoft C# 2010 Express 和 Imperx 的 FrameLink Express 驱动程序。当我尝试在运行时加载 DLL 时,出现异常:

无法加载 DLL 'VCECLB.dll':指定的模块不能 成立。 (HRESULT 例外:0x8007007E)

如果我尝试添加 DLL 作为参考,我会收到以下消息:

无法添加对“C:\\VCECLB.dll”的引用。请 确保该文件是可访问的,并且它是一个有效的程序集 或 COM 组件。

两个问题:

    这是 Express 问题(即 Express 的某些限制导致问题)吗?我相信 DLL 的源代码是用 C++ 编写的,但我认为这无关紧要。

    是否有不同的方式来引用 DLL 和/或将其添加到项目中?我做错了什么?

最后,我尝试添加 x86 和 x64 版本、调试和发布。每次都无法添加为参考。

【问题讨论】:

【参考方案1】:

该 DLL 似乎不是 .NET(也不是 COM)代码 - 因此您无法加载它,也无法添加对它的引用。

与您的 Express 版本没有任何关系 - 它只是不是 .NET “兼容” DLL,因此您无法加载或引用它。

为了使用它的功能,您可能需要深入研究从 .NET 调用原始 C++ 代码的更“神秘”(以及更精细和更复杂)的方法 - 或者找到与 .NET 兼容的对应物或版本它。

【讨论】:

我能否获得与 .NET 兼容的版本值得怀疑,但很高兴知道这不是 Express 的问题。你介意给我指点神秘的方法吗?目前我在我想调用的任何函数上使用 DLLImport。 @GrandAdmiral:这基本上是要走的路,是的 - see this MSDN article on Platform Invoke (p/invoke) 与非托管代码库交互 这就是我正在做的事情......不幸的是,当我将它添加到项目中(作为文件)时,我没有将其设置为将文件复制到运行时位置。愚蠢的错误。感谢大家的帮助!【参考方案2】:

实际上,答案似乎在消息的第一行: 无法加载 DLL 'VCECLB.dll':找不到指定的模块。 (来自 HRESULT 的异常:0x8007007E 它说它找不到 DLL,而不是 DLL 不兼容。 DLL 应该与您的程序中的其他 DLL 一起定位,并且您需要将 DLL 添加到解决方案中。

如果 DLL 被编译为原生 C/C++(即非 .NET 样式),则可以从 .NET 样式的 C/C++ 调用它,但不是 C# 例程。

因此,如果问题是模块可以找到但无法加载,您需要编写一个 C++ (.NET) 例程从您的 C# 例程 (.NET) 调用 C++ (Not .NET)。

所有直接与硬件对话的代码都必须在某种程度上做到这一点。大多数人使用多个 DLL 为您执行此操作。

【讨论】:

以上是关于使用 Microsoft Visual C# 2010 Express 加载 DLL的主要内容,如果未能解决你的问题,请参考以下文章

当我在 Visual Studio C# 中使用 Microsoft.Expression.Encoder 时出现错误

使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

为啥某些 Microsoft 语言被称为“视觉”? (Visual C#、Visual Basic .NET、Visual C++)

如何使用 Microsoft Visual Studio 将查询插入到 C# 中的另一个查询中?

在 Microsoft Visual Studio 2012 中使用 Java

C# 如何调整DataTable的大小?有人说调属性,但是MicroSoft Visual 2010 C# 没有DataTable控件。