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

Registration-free COM When Dll Located in Separate Folder

这个问题之前已经在 SO 上被问过,例如 here and here。这种情况是,有人想在他们的应用程序中使用 COM 组件,而不必在机器上注册 COM 组件。这是通过将两个清单文件添加到客户端和一个到服务器来实现的,OS 的并排功能负责其余的工作。现在,当所有 Dll 都在同一个文件夹中时,这就可以正常工作了。

在我的特定情况下,我试图让旧版 .net 2.0 dll 访问 4.0 dll。我们不想更改 2.0 dll 并且使用上述方法我能够完成此操作。但是,如果 4.0 dll 位于可执行文件(2.0 dll)的子文件夹中。并排执行开始时找不到 4.0 dll。我目前正在调用 win32 API 并创建一个传入清单文件的新 ActivationContext。我使用 ProcMon 并看到正在可执行目录中查找 dll,而不是在清单中指定的查找路径中。正如上面的链接也证明的那样,.net 似乎只知道清单中的 ClrClass,而忽略了为私有程序集查找提供的 AssemblyLocation,这是非常不幸的!

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

是否有任何类型的 hack 可以让应用程序认为它暂时位于其他地方以便找到 dll?

我也知道使用 service(web, windows) 来启用调用 4.0 应用程序的 2.0 应用程序。除了上述三种之外,任何其他可能性将不胜感激。

您应该能够在 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 的子文件夹,这应该适用于您的情况。