Установить пользовательский путь к ссылочным DLL?
У меня есть проект C # (назовите его MainProj
), который ссылается на несколько других DLL-проектов. Добавив эти проекты в MainProj
на MainProj
, он их построит и скопирует полученные DLL в рабочий каталог MainProj.
Я бы хотел, чтобы эти ссылочные DLL были расположены в подкаталоге рабочего каталога MainProj, то есть MainProj / bin / DLL, а не в самом рабочем каталоге.
Я не очень опытный программист на C #, но, исходя из мира C ++, я предполагаю, что одним из способов было бы удалить ссылки на проект и явно загрузить требуемые DLL по пути и имени файла (то есть в C ++, LoadLibrary
). Однако я предпочел бы сделать это, если бы это было так, было бы установить какой-то «ссылочный двоичный путь», так что все они будут автоматически скопированы в этот поддирелл, когда я буду строить (а затем буду ссылаться туда без мне нужно явно загружать каждый). Возможно ли это?
- постоянные ссылки с typedef и шаблонами в c ++
- О привязке ссылки const к под-объекту временного
- Разница между константой const и нормальным параметром
- Разница между std :: reference_wrapper и простым указателем?
- Одна ошибка VS2010? Разрешить привязку не-const ссылки на rvalue БЕЗ ДАЖЕ предупреждение?
Если нет, то какой из предпочтительных методов в C # выполнить то, что мне нужно (т.е. что-то с Assembly.Load
/ Assembly.LoadFile
/ Assembly.LoadFrom
? Что-то в AppDomain
возможно, или System.Environment
?)
- Что такое «корневая ссылка»?
- Как ссылаться на общие classы и методы в XML-документации
- Как скопировать содержимое одного ArrayList в другое?
- Постоянный ресурс ссылки C ++ (контейнерный адаптер)
- Java, pass-by-value, ссылочные переменные
- Json и Java - Циркулярная ссылка
- Есть ли getchas с использованием varargs со ссылочными параметрами
- Почему C # не поддерживает возврат ссылок?
С этой страницы (непроверенный мной):
Где-то в инициализации вашей программы (прежде чем вы получите доступ к любым classам из ссылочной сборки) выполните следующее:
AppDomain.CurrentDomain.AppendPrivatePath(@"bin\DLLs");
Изменить: В этой статье говорится, что AppendPrivatePath считается устаревшим, но также дает обходное решение.
Edit 2: Похоже, самый простой и самый кошерный способ сделать это в файле app.config (см. Здесь ):
От Tomek ответьте на: Загрузка DLL из пути, указанного в SetdllDirectory, в c #
var dllDirectory = @"C:/some/path"; Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory)
Это отлично работает для меня!
Вот еще один способ продолжить работу без использования устаревшего AppendPrivatePath
. Он ловит какое-то событие « связанная DLL не найдена » (поэтому он будет вызываться только в том случае, если dll не найден в каталоге по умолчанию).
Работает для меня (.NET 3.5, не проверены другие версии)
/// /// Here is the list of authorized assemblies (DLL files) /// You HAVE TO specify each of them and call InitializeAssembly() /// private static string[] LOAD_ASSEMBLIES = { "FooBar.dll", "BarFooFoz.dll" }; /// /// Call this method at the beginning of the program /// 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
, это слишком трудоемко.