我正在开发一个.Net组件,它将作为插件存在于Windows应用程序中。此插件将使用regasm在客户端计算机上注册。我的组件嵌入了大部分依赖项,并在请求时将程序集返回给AppDomain。如果我尝试在我的单个dll上运行regasm,它会失败,因为它无法找到文件夹中的依赖项。在客户端计算机上安装组件时,这将是一个问题。
有没有办法告诉regasm在哪里获取嵌入式dll?
到目前为止我尝试过:
使用附近的dll注册组件,然后将单个dll复制到运行时文件夹。我的组件工作,并在运行时发现dll,但这不是部署的选项。
使用ComRegisterFunctionAttribute挂钩。只有当dll在附近才会被调用,所以它不会比#1好。
我无法控制regasm被调用的事实。我不拥有来使我的组件成为一个单独的dll,但如果我可以解决这个问题,它将使部署变得更加容易。
答案 0 :(得分:1)
新答案:
我猜你的[ComRegisterFunction]
是一个类中的方法,它引用了其他一个程序集中的类型。您的代码可能无法运行,因为它无法JIT编译ComRegister方法,因为它无法找到类或方法中某个类型的程序集。
尝试创建一个没有外部依赖项的类(除了.net框架),并将ComRegisterFunction属性放在该类中。您的安装是否在那里工作,但只能从其他类型动态加载程序集,以便您可以使用自定义代码来定位外部程序集。
答案 1 :(得分:-1)
Ld00d,我遇到了同样的问题。你是怎么做到的:"我删除了COM注册的dll中的引用"?这对我来说听起来很神奇。你使用ildasm然后使用ilasm吗?
我认为regasm.exe这个严重问题没有解决办法。
只有当程序集[ComRegisterFunction]
的上一次验证以成功结束时, regasm.exe才会调用GetReferencedAssemblies
方法。
您可以尝试ildasm然后ilasm您的dll删除这些引用,但我认为它可能会带来混乱。我也不知道如果你模仿代码会发生什么。
我的解决方法:
在安装过程中,将regasm.exe询问的DLL复制到DLL的文件夹中。
在regasm.exe完成DLL注册后立即删除它们。
不好(安装程序软件占用大量磁盘空间),但有效。