1

我正在开发一个 .Net 组件,它将作为插件存在于 Windows 应用程序中。这个插件将使用 regasm 在客户端机器上注册。我的组件嵌入了它的大部分依赖项,并在请求时将程序集返回给 AppDomain。如果我尝试在我的单个 dll 上运行 regasm,它会失败,因为它无法在文件夹中找到依赖项。在客户端机器上安装组件时,这将是一个问题。

有没有办法告诉 regasm 从哪里获取嵌入式 dll?

到目前为止我已经尝试过:

  1. 使用附近的 dll 注册组件,然后将单个 dll 复制到运行时文件夹。我的组件工作正常,并且在运行时发现了 dll,但这不是部署的选项。

  2. 使用 ComRegisterFunctionAttribute 挂钩。只有当 dll 在附近时才会调用它,所以它并不比 #1 好。

我无法控制 regasm 会被调用的事实。不必使我的组件成为单个 dll,但如果我能解决这个问题,它会使部署变得相当容易。

4

2 回答 2

1

新答案:

我猜你[ComRegisterFunction]是在一个类中引用来自其他程序集之一的类型的方法。您的代码可能没有运行,因为它无法 JIT 编译 ComRegister 方法,因为它找不到您的类或方法中的一种类型的程序集。

尝试创建一个没有外部依赖项(.net 框架除外)的类,并将 ComRegisterFunction 属性放在该类中。在那里进行安装工作,但仅从其他类型动态加载程序集,以便您可以使用自定义代码来定位外部程序集。

于 2012-06-28T20:45:31.610 回答
-1

Ld00d,我有同样的问题。你是怎么做到的:“我删除了 COM 注册 dll 中的引用”?对我来说这听起来很神奇。你用了 il​​dasm 然后是 ilasm 吗?

我认为 regasm.exe 的这个严重问题没有解决方案。

regasm.exe[ComRegisterFunction]仅当程序集的先前验证GetReferencedAssemblies以成功结束时才调用方法。您可以尝试 ildasm 然后 ilasm 您的 dll 删除这些引用,但我认为它可能会带来混乱。我也不知道如果你滥用代码会发生什么。

我的解决方法:

  1. 在安装过程中,将 regasm.exe 询问的那些 DLL 复制到 DLL 的文件夹中。

  2. 在 regasm.exe 完成 DLL 注册后删除它们。

不太好(安装软件会占用大量磁盘空间),但可以。

于 2014-03-27T14:27:25.340 回答