Извиняюсь заранее, если название не имеет смысла. Я очень новичок в приложениях и сборке, и не знаю, как заявить, что я пытаюсь спросить.
Я возился с загрузкой встроенных DLL-приложений в приложение во время выполнения, и я не могу понять, почему он работает в одном направлении, но не в другом. Похоже, что если вы попытаетесь загрузить DLL файлы (из массива байтов) в текущий appdomain, любые объекты/потоки, созданные после этого, смогут разрешать ссылки на недавно загруженную библиотеку, однако объекты в исходном контексте не будут разрешены в отношении недавно загруженная библиотека.
Вот моя библиотека примеров, которая будет загружаться из встроенного ресурса во время выполнения (требуется ссылка на WPF PresentationFramework.dll для MessageBox):
namespace LoaderLibrary
{
public class LoaderLibrary
{
public static void Test()
{
System.Windows.MessageBox.Show("success");
}
}
}
В моем консольном приложении .csproj файл я вручную добавьте следующий внедренный ресурс для этого проекта и включить ссылку на проект в LoaderLibrary:
<ItemGroup>
<EmbeddedResource Include="..\LoaderLibrary\bin\$(Configuration)\LoaderLibrary.dll">
<LogicalName>EmbeddedResource.LoaderLibrary.dll</LogicalName>
</EmbeddedResource>
</ItemGroup>
Вот код для моего консольного приложения, которое загружает эту библиотеку (требует ссылку на проект для LoaderLibrary csproj) ТАКЖЕ: нужно установить CopyLocal strong > до false для справки LoaderLibrary:
namespace AssemblyLoaderTest
{
class Program
{
static void Main(string[] args)
{
EmbeddedAssembly.Load("EmbeddedResource.LoaderLibrary.dll");
System.AppDomain.CurrentDomain.AssemblyResolve += (s, a) => { return EmbeddedAssembly.Get(a.Name); };
var app = new TestApp();
}
}
public class TestApp
{
public TestApp()
{
LoaderLibrary.LoaderLibrary.Test();
}
}
public class EmbeddedAssembly
{
static System.Collections.Generic.Dictionary<string, System.Reflection.Assembly> assemblies = new System.Collections.Generic.Dictionary<string, System.Reflection.Assembly>();
public static void Load(string embeddedResource)
{
using (System.IO.Stream stm = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedResource))
using (var mstream = new System.IO.MemoryStream())
{
stm.CopyTo(mstream);
var assembly = System.Reflection.Assembly.Load(mstream.ToArray());
assemblies.Add(assembly.FullName, assembly);
return;
}
}
public static System.Reflection.Assembly Get(string assemblyFullName)
{
return (assemblies.Count == 0 || !assemblies.ContainsKey(assemblyFullName)) ? null : assemblies[assemblyFullName];
}
}
}
Этот код способен успешно загружать и выполнять функцию LoaderLibrary.LoaderLibrary.Test().
Мой вопрос в том, почему следующее не работает?
static void Main(string[] args)
{
EmbeddedAssembly.Load("EmbeddedResource.LoaderLibrary.dll");
System.AppDomain.CurrentDomain.AssemblyResolve += (s, a) => { return EmbeddedAssembly.Get(a.Name); };
LoaderLibrary.LoaderLibrary.Test(); // very unhappy line of code
}
Это также не работает:
static void Main(string[] args)
{
EmbeddedAssembly.Load("EmbeddedResource.LoaderLibrary.dll");
System.AppDomain.CurrentDomain.AssemblyResolve += (s, a) => { return EmbeddedAssembly.Get(a.Name); };
var app = new TestApp();
LoaderLibrary.LoaderLibrary.Test(); // very unhappy line of code
}