Не удается загрузить управляемую сборку, расположенную в одной папке
Чтобы воссоздать свою производственную среду, я создал следующую структуру папок:
c: \ TEST \ test.dll c:\TEST\test \ tools.dll
Test.dll скомпилирован с использованием следующего файла App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="tested"/>
</assemblyBinding>
</runtime>
</configuration>
Насколько я знаю, приложение должно искать его файл инструментов в подпапке. Когда я пытаюсь запустить станцию, я все еще получаю ошибку, что файл не был найден.
Чтобы дать некоторый контекст, вот пример исходного кода tests.dll:
namespace ConsoleApplication1
{
public static class Testable
{
public static tools.IToolAble usefultool = null;
public static void initialisation()
{
if (usefultool == null) usefultool = new UsefulTest()
}
}
public class UsefulTest : tools.IToolAble
{
}
}
и пример tools.dll источник:
namespace tools
{
public interface IToolAble
{
}
}
Код, который вылетает, - это мой тестовый код, который работает следующим образом:
private CustomMock controller = new CustomMock();
public void TestFixtureSetUp()
{
controller.LoadFrom(@"c:\TEST\tested.dll");
//The next line crashes because tools assembly is needet but not found
controller.InvokeInitialisation();
}
Что мне не хватает? App.config правильный?
РЕДАКТИРОВАТЬ:
Ответ ниже является правильным, путь известен только после того, как можно выбрать правильный DLL. Так что другая команда должна добавить new ResolveEventHandler
перед загрузкой. Вот упрощенная версия этого:
internal void AddResolveEventHandler(string assemblyname, string assemblylocation)
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler(
(sender, args) =>
{
Assembly ret = null;
if (
new AssemblyName(args.Name).Name == assemblyname &&
File.Exists(assemblylocation))
{
ret = Assembly.LoadFrom(assemblylocation);
}
return ret;
}
);
}
1 ответ
test.dll скомпилирован с использованием следующего файла App.config
Это должен быть файл yourapp.exe.config, а не файл.config для DLL. CLR всегда ищет только файл.config, связанный с основным процессом.
И обратите внимание на app.vshost.exe.config, необходимый при отладке с включенным процессом хостинга.
И будьте осторожны при использовании бегунов модульного теста, другой файл.exe
Подумайте, действительно ли это стоит того. Вашему пользователю будет все равно, где находится DLL.