Regasm找不到嵌入式程序集

时间:2012-06-28 18:04:50

标签: .net com-interop regasm

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

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

到目前为止我尝试过:

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

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

  3. 我无法控制regasm被调用的事实。我不拥有来使我的组件成为一个单独的dll,但如果我可以解决这个问题,它将使部署变得更加容易。

2 个答案:

答案 0 :(得分:1)

新答案:

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

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

答案 1 :(得分:-1)

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

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

只有当程序集[ComRegisterFunction]的上一次验证以成功结束时,

regasm.exe才会调用GetReferencedAssemblies方法。 您可以尝试ildasm然后ilasm您的dll删除这些引用,但我认为它可能会带来混乱。我也不知道如果你模仿代码会发生什么。

我的解决方法:

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

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

  3. 不好(安装程序软件占用大量磁盘空间),但有效。