С# Установить зондирование privatePath без app.config?
У меня есть приложение С#, и для организации его файлов у меня есть некоторая DLL в папке "Данные". Я хочу, чтобы EXE проверял эту папку для DLL, точно так же, как она проверяет свой текущий каталог. Если я создал App.Config с этой информацией:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Data" />
</assemblyBinding>
</runtime>
</configuration>
Он работает без проблем. Я не хочу иметь App.Config. Есть ли способ установить путь исследования без использования app.config?
Ответы
Ответ 1
Вы можете сделать это для создания новых AppDomains, я не верю, что есть способ сделать это в управляемом коде для текущего/стандартного AppDomain.
Изменить: Создание AppDomain с закрытым путем: используйте AppDomain.CreateDomain и AppDomainSetup.PrivateBinPath
Ответ 2
Это старый вопрос, но вы также можете обрабатывать событие AppDomain AssemblyResolve
следующим образом:
`` `
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
`` `
и
`` `
private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var probingPath = pathToYourDataFolderHere;
var assyName = new AssemblyName(args.Name);
var newPath = Path.Combine(probingPath, assyName.Name);
if (!newPath.EndsWith(".dll"))
{
newPath = newPath + ".dll";
}
if (File.Exists(newPath))
{
var assy = Assembly.LoadFile(newPath);
return assy;
}
return null;
}
`` `
Ответ 3
setup.ApplicationBase = dataDir; тоже самое, что и privatePath = "Данные"
[STAThread]
static void Main()
{
#region Add Dll Folder
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(MainForm));
string dataDir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(new Uri(assembly.GetName().CodeBase).LocalPath), "Data");
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = dataDir;
#endregion Add Dll Folder
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}