C# 设置其他库引用的DLL的路径

C# 设置其他库引用的DLL的路径,c#,dll,reference,path,C#,Dll,Reference,Path,我有一个C#项目,一个类库,它是另一个项目的模块,它的输出路径位于主项目输出路径(即outputpath=C:\which\MainProject\Modules)的子文件夹中 在这个项目中,我引用了一个库(我们称之为a.dll)。这个库本身工作正常,但这个a.dll在运行时需要其他库(我们称它们为b.dll和c.dll)。我通过添加->现有项添加了这两个文件,并将b.dll和c.dll的“复制到输出目录”设置为“始终复制” 当我构建项目时,所有三个dll都被复制到项目的输出路径中(正如预期的那

我有一个C#项目,一个类库,它是另一个项目的模块,它的输出路径位于主项目输出路径(即outputpath=C:\which\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的源代码。

此答案的第一部分基于以下内容:

所使用的方法基本上与链接中引用的方法相同,但它没有使用XAML方法,而是使用C#/code方法(更容易调试/了解发生了什么)

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

如果全部失败和/或您在这里一事无成,您也可以尝试以下方法:

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

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

在活动中,您可以执行以下操作: AssemblyName reqAssemblyName=新的AssemblyName(args.Name)


要获取两个程序集的路径,可以使用
path.Combine(path.GetDirectoryName(Assembly.getexecutinggassembly().Location)、“mysubfolder”、“b.dll”)

我尝试了你的第一个答案。这并不是说它再也找不到dll了,而是在a.dll内部引发了一个异常。a.dll是否可能是以某种方式开发的,如果b.dll和c.dll不在主项目路径中,那么a.dll就不可能与它们一起工作?我认为这是不可能的。也许c或d.dll需要ther reference?在任何情况下,您都应该尝试在.dll中获取有关该异常的更多信息。可能在
异常设置窗口中启用
公共语言运行时异常
,了解有关该异常的更多详细信息。如果抛出异常,请深入了解该异常,以准确了解其抱怨的内容。检查
错误账龄
StackTrace
InnerException
(可以是递归的,因为异常可以有一个
InnerException
,这也是一个异常)我不认为b.dll和c.dll需要另一个引用,因为当它们在MainProjects文件夹中时,我没有得到任何异常,库也可以工作。遗憾的是,抛出的异常是一个自定义异常。它只是说“OBID.femlception:Error in Module FEDM:传输的指针为NULL”我目前不能使用调试器,只记录文件中的异常,因为我不能在瞬间构建主项目。这有很大的区别。例如,上面提到的第二种方法不能用C++ DLL工作。您应该明确地启动FuslogVW。我确信它也记录C++引用。需要针对子文件夹中的dll运行regsvr32,而不仅仅是针对basefolder中的dll运行regsvr32。我没有这样做。我应该这样做吗?这就是我所做的,以使所有dll在不在项目根目录下工作:
System.IO.Directory.SetCurrentDirectory(“Modules\\EDoor\\Libs”);
if (reqAssemblyName.Name.ToLowerInvariant() == "b")
{
    return Assembly.LoadFrom(pathToAssemblyB);
}
else if (reqAssemblyName.Name.ToLowerInvariant() == "c")
{
    return Assembly.LoadFrom(pathToAssemblyC);
}
else
{
   return null;
}