无法引用安装路径父目录程序集,求2ndApp.exe.config配置方案
解决.NET程序依赖DLL的目录探测问题
先明确你的目录层级:
- 应用程序基目录(默认是exe所在目录):
C:/ProgramFiles/APP_Name/App_Base_Dir/2ndAppFolder/bin/ - 依赖DLL所在目录:
C:/ProgramFiles/APP_Name/App_Base_Dir/
你之前的probing配置无效,是因为privatePath的路径是相对于应用程序基目录的相对路径,不是绝对路径,也不是安装根目录的名称。要指向依赖DLL的目录,需要用相对路径向上回溯:
正确的AssemblyProbing配置
在2ndApp.exe.config里按如下配置:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 用../回到上一级,../../就是两级,指向App_Base_Dir --> <probing privatePath="../../"/> </assemblyBinding> </runtime> </configuration>
如果有多个需要探测的目录,也可以用分号分隔,比如同时要探测当前目录的子目录和上级目录:
<probing privatePath="libs;../../"/>
其他可行方案
1. 使用元素指定具体DLL路径
如果某些DLL的路径比较特殊,或者不想用相对路径,也可以直接指定每个DLL的绝对路径:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="YourDllName" publicKeyToken="xxxx" culture="neutral"/> <codeBase version="1.0.0.0" href="file:///C:/ProgramFiles/APP_Name/App_Base_Dir/YourDllName.dll"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:使用
2. 修改应用程序基目录
如果你的程序允许,可以通过代码或者启动方式修改应用程序基目录,让它指向App_Base_Dir,这样CLR会自动在这个目录下查找依赖DLL。比如在程序启动时(比如用另一个启动器)设置:
AppDomain.CurrentDomain.SetData("APPBASE", @"C:/ProgramFiles/APP_Name/App_Base_Dir");
不过这种方式需要额外的启动逻辑,适合需要统一管理所有依赖的场景。
3. 复制DLL到Exe目录
最简单的方式是把依赖DLL直接复制到2ndApp.exe所在的bin目录下,CLR默认会优先查找当前目录的DLL,不需要额外配置。但这种方式会导致文件重复,不适合需要集中管理依赖的场景。
内容的提问来源于stack exchange,提问作者Vinay Gupta
相关产品推荐
相关产品推荐

