【问题标题】:DLL doesn't work when removed from its original locationDLL 在从其原始位置删除时不起作用
【发布时间】:2014-07-08 02:00:00
【问题描述】:

我正在用 VB.NET 编写一个应用程序,它的一个要求是与一个硬件接口以进行光功率测量。生产硬件的公司在机器上有 DLL(运行 Windows 2000 或 XP,取决于我看的是哪一个),我们目前有与这些 DLL 一起工作的软件,并且是用 VB6 编写的。

除了与这些机器交互之外,我正在编写的应用程序还需要与其他使用不同公司生产的硬件进行测量并使用不同调用的机器进行交互。由于我不知道 DLL 是否会一直存在,所以我决定将它们包含在程序中。

我在 VB6 项目中检查了哪些引用正在被使用,并基于这些,我将必要的 DLL 转移到项目中,将它们作为引用加载,然后编译项目。但它没有运行。我尝试复制或不复制 DLL,将它们放在我用来编写应用程序的计算机上的同一路径中。我所做的一切似乎都会导致错误如下:

无法加载文件或程序集 Interop.Instrument12001b,Version=1.0.0.0,Culture=neutral,Public Key Token = null 或其依赖项之一。系统找不到指定的文件。

在这一点上,我不确定我还剩下什么选择。我可以尝试在运行时加载 DLL,但是 1)我可以忽略错误来编译程序吗?和 2) 即使我不知道 DLL 的内容,它也会起作用吗?

编辑: 事实证明,整个问题是由于 VS2013 Express 中的一个错误造成的。无论出于何种原因,该特定版本的 Visual Studio 都不会为 .NET 2.0 创建互操作 DLL。我可以通过使用 VS2010 Express 来解决这个问题。

【问题讨论】:

标签: .net vb.net dll


【解决方案1】:

当您引用 COM 库时,VS 会生成一个 Interop DLL,它是一个 .NET 程序集,允许您的 .NET 应用程序与 COM 库进行互操作。部署时,Interop 库必须与您的 EXE 位于同一文件夹中,但您仍需要 COM 库存在并在目标计算机上注册,否则将无法进行互操作。

【讨论】:

  • 当您说“已注册”时,您的意思是出现在与原始机器相同的位置,还是我需要做更多的事情才能让库注册?我是否还需要将我的互操作 DLL 与程序一起提供?它们不包含在 EXE 文件中吗?
  • 如果 DLL 被“包含”在 EXE 中,那么我就不会说“Interop 库必须与您的 EXE 位于同一文件夹中”。至于注册,这就是COM的工作方式。 .NET 的一大优点是您可以简单地将程序集放在机器上,它就会工作。使用 COM 组件,您必须向系统注册它们,以便系统知道它们是什么以及它们在哪里。如果 COM 组件未注册,则系统不知道它存在,因此任何应用程序都无法使用它。如果您想了解更多关于注册 COM 组件的信息,可以通过网络搜索。
  • 谢谢。好消息是在将这些互操作库放在它们所属的位置之后,我不再收到系统找不到指定文件的错误消息。坏消息是我收到一条错误消息,提示“程序集是由比当前加载的运行时更新的运行时构建的,无法加载”,当我在 .NET 2.0 中编译并在 .NET 中运行时,这很令人困惑2.0.
  • 更新:看起来问题可能是由于 tlbimp.exe 使用 .NET 4.5 转换 COM 文件,所以我现在正在调查。
猜你喜欢
  • 2022-12-14
  • 2014-12-09
  • 2021-05-13
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多