设置另一个库

时间:2016-02-10 12:56:49

标签: c# dll reference path

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

在这个项目中,我引用了一个库(我们称之为a.dll)。这本身工作正常,但这个a.dll需要运行时其他库工作(让我们称之为b.dll和c.dll)。我通过Add添加了这两个文件 - &gt;现有项目,并为b.dll和c.dll设置“复制到输出目录”为“始终复制”。

当我构建项目时,所有三个dll都被复制到项目的输出路径中(如预期的那样),但是a.dll似乎无法找到它们。 只要我将b.dll和c.dll复制到main-projects文件夹(.exe所在的位置),a.dll就会突然找到它们。

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

1 个答案:

答案 0 :(得分:1)

此答案的第一部分基于可在此处找到的内容:https://stackoverflow.com/a/1892515/937093

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

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

如果一切都失败了和/或你在这里无处可去,你也可以尝试以下方法:

在C#/。NET中你有一个事件AppDomain.CurrentDomain.AssemblyResolve,你可以阅读它here

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

在活动中你可以这样做: AssemblyName reqAssemblyName = new AssemblyName(args.Name);

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");