设置另一个库引用的 dll 的路径

本文关键字:dll 路径 引用 另一个 设置 | 更新日期: 2023-09-27 18:33:58

我有一个C#项目,一个类库,它是另一个项目的模块,它的输出路径位于主项目输出路径内的子文件夹中(即输出路径= C:''WHATEVER''MainProject''Modules。

在这个项目中,我引用了一个库(我们称之为a.dll(。 这本身工作正常,但是这个 a.dll 需要在运行时使用其他库才能工作(我们称它们为 b.dll 和 c.dll(。我通过添加 -> 现有项目添加了这两个文件,并将 b.dll 和 c.dll 的"复制到输出目录"设置为"始终复制"。

当我构建项目时,所有三个 dll 都被复制到项目的输出路径中(如预期的那样(,但 a.dll 似乎找不到它们。一旦我将 b.dll 和 c.dll 复制到主项目文件夹(.exe所在的位置(a.dll就可以突然找到它们。

我不想在主项目文件夹中包含 b.dll 和 c.dll,因为它们只是我目前正在开发的模块的一部分,而不是主项目本身。如何(在Visual Studio 2015中(告诉a.dll在哪里查找b.dll和c.dll?我尝试在 appconfig 中添加探测部分(如此处建议:从另一个 DLL 引用 DLL(,但这没有效果。我没有.dll的源代码。

设置另一个库引用的 dll 的路径

这个答案的第一部分是基于这里可以找到的内容: https://stackoverflow.com/a/1892515/937093

使用的方法与链接中引用的方法基本相同,但它不使用 XAML 方法,而是使用 C#/code 方法(更容易调试/弄清楚发生了什么(。

按照该答案中所述添加自定义路径。在应用程序的Main方法中执行此操作。首先添加该文件夹的相对路径,如果这不起作用,请查看此处:fuslogvw的解释,以确定您的程序正在查找的位置,可能是路径错误或您没有权限查看该特定目录。

如果全部失败和/或您在这里无处可去,您还可以尝试以下方法:

在 C#/.NET 中,您有一个事件AppDomain.CurrentDomain.AssemblyResolve,您可以在此处阅读有关它的信息。

简而言之,如果 .NET 找不到程序集,并且该事件的事件处理程序允许您解析 .NET 的程序集,则甚至会触发该程序集。

在事件中,您可以执行以下操作:AssemblyName reqAssemblyName = new AssemblyName(args.姓名(;

if (reqAssemblyName.Name.ToLowerInvariant() == "b")
{
    return Assembly.LoadFrom(pathToAssemblyB);
}
else if (reqAssemblyName.Name.ToLowerInvariant() == "c")
{
    return Assembly.LoadFrom(pathToAssemblyC);
}
else
{
   return null;
}

若要获取两个程序集的路径,可以使用Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "mysubfolder","b.dll");