C#引用dll相对于外部工作目录(Visual Studio 2015)

时间:2015-11-29 18:31:37

标签: c# dll visual-studio-2015

运行我正在研究的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;
    }

0 个答案:

没有答案