将自定义path设置为引用的DLL?

我有一个C#项目(称之为MainProj ),它引用了其他几个DLL项目。 通过将这些项目添加到MainProj的引用中,它将构build它们并将其生成的DLL复制到MainProj的工作目录。

我想要做的就是把这些引用的DLL放在MainProj工作目录的子目录,即MainProj / bin / DLL中,而不是工作目录本身。

我不是一个非常有经验的C#程序员,但来自C ++世界,我假设一种方法是删除项目引用,并显式加载所需的DLL的path和文件名(即在C + +, LoadLibrary )。 然而,如果有一种方法,我想要做的是设置某种“参考二进制path”,所以当我构build时,它们都会被自动复制到这个子目录(然后从那里引用我需要明确加载每个)。 这样的事情可能吗?

如果不是,C#中的首选方法是什么,我完成了什么(即东西与Assembly.Load / Assembly.LoadFile / Assembly.LoadFrom ?什么在AppDomain也许,或System.Environment ?)

从这个页面 (未经我testing):

在程序初始化的某个地方(在访问引用程序集中的任何类之前)执行以下操作:

 AppDomain.CurrentDomain.AppendPrivatePath(@"bin\DLLs"); 

编辑: 这篇文章说AppendPrivatePath被认为是过时的,但也提供了一个解决方法。

编辑2:看起来像最简单,最犹太的方式来做到这一点是在app.config文件(请看这里 ):

 <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="bin\DLLs" /> </assemblyBinding> </runtime> </configuration> 

从Tomek答案在加载dll从SetdllDirectory中指定的path在c#

 var dllDirectory = @"C:/some/path"; Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory) 

这对我来说非常合适!

这是另一种不使用过时AppendPrivatePath 。 它会捕获一种“ 未find关联的dll ”事件(所以只有在缺省目录中找不到dll时才会调用它)。

适用于我(.NET 3.5,未testing其他版本)

 /// <summary> /// Here is the list of authorized assemblies (DLL files) /// You HAVE TO specify each of them and call InitializeAssembly() /// </summary> private static string[] LOAD_ASSEMBLIES = { "FooBar.dll", "BarFooFoz.dll" }; /// <summary> /// Call this method at the beginning of the program /// </summary> public static void initializeAssembly() { AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args) { string assemblyFile = (args.Name.Contains(',')) ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name; assemblyFile += ".dll"; // Forbid non handled dll's if (!LOAD_ASSEMBLIES.Contains(assemblyFile)) { return null; } string absoluteFolder = new FileInfo((new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).LocalPath).Directory.FullName; string targetPath = Path.Combine(absoluteFolder, assemblyFile); try { return Assembly.LoadFile(targetPath); } catch (Exception) { return null; } }; } 

PS:我没有设法使用AppDomainSetup.PrivateBinPath ,这是太辛苦了。