[英]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.