运行我正在研究的C#类库时遇到了一些问题。问题是我需要从外部工作目录的子文件夹加载引用dll。
我的环境如下:
我的项目文件位于我的正常项目存储区域内:
/Documents/VS2015/Projects/..
由于应用程序的性质,此类库具有指定的工作目录:
C:/Program Files (x86)/ProgramName/
并且dll需要存储在该工作目录中的lib文件夹中:
C:/Program Files (x86)/ProgramName/lib/
由于我的调试配置定义了工作目录,因此我的调试版本自然会在项目存储的范围之外运行。
如果我将dll放在根工作目录( C:/ Program Files(x86)/ProgramName/reference.dll )中,那么类库将完全正常运行,但是只要我放入我需要它们在子文件夹中的dll( C:/ Program Files(x86)/ProgramName/lib/reference.dll )程序中断:
System.IO.FileNotFoundException: Could not load file or assembly
我已经研究了这个问题已经有一段时间了,并尝试更新.csproj项目文件中的HintPaths,在app.config中设置依赖项和probingPaths以及在项目设置中定义引用路径,都无济于事
如何告诉我的项目获取这些dll的任何帮助都将非常感激。
更新:添加
<probing privatePath="lib"/>
到我的app.config没有解决问题。
解决方案:
我最后通过使用AppDomain.AssemblyResolve:
解决了这个问题AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(LoadFromSameFolder);
static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{
string folderPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string fp = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
int index = fp.LastIndexOf('.');
string fpo = index == -1 ? fp : fp.Substring(0, index);
string fpo2 = fpo + "\\lib\\";
string assemblyPath = Path.Combine(fpo2, new AssemblyName(args.Name).Name + ".dll");
if (File.Exists(assemblyPath) == false) return null;
Assembly assembly = Assembly.LoadFrom(assemblyPath);
return assembly;
}