将自定义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
,这是太辛苦了。