【问题标题】:Regasm can't find embedded assembliesRegasm 找不到嵌入式程序集
【发布时间】:2014-04-04 02:33:54
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你试过regasm /codebase 吗?这会将您的程序集文件的路径放在 COM 注册条目中(在注册表中)。
  • 不幸的是,我无法控制 regasm 的调用方式,但是 regasm 可以轻松找到我的程序集。它只是找不到嵌入其中的程序集——也不会询问它们在哪里。
  • 谁在叫regasm? MSI 安装程序?
  • 应用程序。它会检查是否有要添加的组件。在尝试加载它们之前,它会将它们拉下来并注册它们。

标签: .net com-interop regasm


【解决方案1】:

新答案:

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

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

【讨论】:

  • 是的,这就是我的 dll 找到其嵌入程序集的方式。这工作得很好。 Regasm 是找不到他们的那个。我认为我的解决方案是删除对嵌入式 dll 的引用并使用名称通过反射加载主要的。
  • 由于您编辑了答案,我的评论看起来不合适,但您现在似乎对这个问题有了更好的处理。你的答案就是我最终做的事情:我删除了 COM 注册 dll 中的引用。它通过反射从依赖 dll 加载启动内容。这个 hack 效果很好。感谢您的回复。
【解决方案2】:

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

我认为regasm.exe这个严重问题没有解决办法。

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

我的解决方法:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2015-03-21
    • 2017-12-20
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多