注册免费COM当Dll位于单独的文件夹

本文关键字:于单独 文件夹 Dll 免费 COM 注册 | 更新日期: 2023-09-27 18:07:15

这个问题以前在SO上被问过,例如这里和这里。这种情况是,人们希望在他们的应用程序中使用COM组件,而不必在机器上注册COM组件。这是通过添加两个清单文件来完成的,一个到客户端,一个到服务器,操作系统的并行特性负责其余的工作。现在,当所有dll都在同一个文件夹中时,这就可以正常工作了。

在我的具体情况下,我试图有一个遗留的。net 2.0 dll访问4.0 dll。我们不想改变2.0的dll,用上面的方法我能够做到这一点。但是,如果4.0 dll位于可执行文件(2.0 dll)的子文件夹中。并行执行开始时找不到4.0 dll。我目前正在调用win32 API,并在manifest文件中创建一个新的ActivationContext。我使用ProcMon,看到dll正在可执行目录中查找,而不是在清单中指定的查找路径中查找。正如上面的链接也证明,似乎。net只知道清单中的ClrClass,而忽略了为私有程序集查找提供的AssemblyLocation,这是非常不幸的!

无论如何,上述链接中的解决方案是GAC和AssemblyResolve。如果可能的话,我不想通过GAC和AssemblyResolve对我不起作用,因为我必须在无法加载4.0 dll的2.0 dll中订阅它。

是否有任何类型的黑客让应用程序认为它暂时位于其他地方,所以dll会被发现?

我也知道使用服务(web, windows)来启用2.0应用程序调用4.0应用程序。除了上述三种之外,任何其他可能性都将受到赞赏。

注册免费COM当Dll位于单独的文件夹

您应该能够在app.config中使用<probing>元素,以便CLR在查找程序集时查看子文件夹。所以如果你的4.0 DLL在子文件夹ComDll你的app.config看起来像这样:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="ComDll"/>
      </assemblyBinding>
   </runtime>
</configuration>

私有路径必须是EXE的子文件夹,这应该在您的情况下工作。