если я использую
Assembly assembly = Assembly.LoadFrom(file);
а позже попытаюсь использовать файл, я получаю исключение о том, что файл уже используется.
мне нужно загрузить его в новый домен приложения.
все, что я, кажется, нашел, это примеры того, как создать экземпляр в сборке, есть ли способ загрузить всю сборку.
мне нужно:
(1) load the assembly into a new AppDomain from a file .
(2) extract an embedded resource (xml file) from the Dll .
(3) extract a type of class which implements an interface (which i know the interface type) .
(4) unload the entire appdomain in order to free the file .
2-4 - это не проблема
Я просто не могу найти, как загрузить сборку в новый AppDomin, только примеры создания экземпляра, который дает мне экземпляр класса из с в Dll.
мне нужно все.
как в этом вопросе: еще один пример создания экземпляра.
Загрузка библиотек DLL в отдельный домен приложений
Ответ 1 · рейтинг 2 · MoonKnight
Самый простой мультидоменный сценарий:
static void Main()
{
AppDomain newDomain = AppDomain.CreateDomain("New Domain");
newDomain.ExecuteAssembly("file.exe");
AppDomain.Unload(newDomain);
}
Вызов ExecuteAssembly в отдельном домене удобен, но не дает возможности взаимодействовать с самим доменом. Это также требует, чтобы целевая сборка была исполняемым файлом, и вынуждает вызывающего объекта использовать единственную точку входа. Чтобы обеспечить некоторую гибкость, вы также можете передать строку или аргументы в .exe.
Надеюсь, это поможет.
Расширение: попробуйте следующее:
AppDomainSetup setup = new AppDomainSetup();
setup.AppDomainInitializer = new AppDomainInitializer(ConfigureAppDomain);
setup.AppDomainInitializerArguments = new string[] { unknownAppPath };
AppDomain testDomain = AppDomain.CreateDomain("test", AppDomain.CurrentDomain.Evidence, setup);
AppDomain.Unload(testDomain);
File.Delete(unknownAppPath);
где AppDomain может быть инициализирован следующим образом
public static void ConfigureAppDomain(string[] args)
{
string unknownAppPath = args[0];
AppDomain.CurrentDomain.DoCallBack(delegate()
{
//check that the new assembly is signed with the same public key
Assembly unknownAsm = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(unknownAppPath));
//get the new assembly public key
byte[] unknownKeyBytes = unknownAsm.GetName().GetPublicKey();
string unknownKeyStr = BitConverter.ToString(unknownKeyBytes);
//get the current public key
Assembly asm = Assembly.GetExecutingAssembly();
AssemblyName aname = asm.GetName();
byte[] pubKey = aname.GetPublicKey();
string hexKeyStr = BitConverter.ToString(pubKey);
if (hexKeyStr == unknownKeyStr)
{
//keys match so execute a method
Type classType = unknownAsm.GetType("namespace.classname");
classType.InvokeMember("MethodNameToInvoke", BindingFlags.InvokeMethod, null, null, null);
}
});
}