Извиняюсь заранее, если название не имеет смысла. Я очень новичок в приложениях и сборке, и не знаю, как заявить, что я пытаюсь спросить.
Я возился с загрузкой встроенных 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
}
