繁体   English   中英

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

[英]Registration-free COM When Dll Located in Separate Folder

例如, 这里这里都曾在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,并创建一个新的ActivationContext传入清单文件。 我使用了ProcMon,看到该dll是在可执行文件目录中查找的,而不是在清单中指定的查找路径中查找的。 正如上面的链接所证明的那样,.net似乎只知道清单中的ClrClass,而忽略了为私有程序集查找提供的AssemblyLocation,这真是不幸!

无论如何,以上链接中的解决方法是GAC和AssemblyResolve。 我不想在可能的情况下通过GAC,AssemblyResolve无法为我工作,因为我必须在无法加载4.0 dll的2.0 dll中订阅它。

是否有任何类型的骇客让应用程序认为它暂时位于其他地方,因此将找到dll?

我也知道使用服务(Web,Windows)来启用2.0应用程序并调用4.0应用程序。 除了上述三种之外,任何其他可能性都将被理解。

您应该能够使用app.config<probing>元素在查找程序集时让CLR在子文件夹中查找。 因此,如果您的4.0 DLL位于ComDll子文件夹中, ComDll app.config将如下所示:

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

专用路径必须是EXE的子文件夹,在您的情况下应该可以使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM