Вот измененная версия цитируемого кода от Матье, которая не требует знания пространства имен для извлечения кода. Для WPF укажите это в коде события запуска приложения.
AppDomain.CurrentDomain.AssemblyResolve += (s, args) =>
{
// Note: Requires a using statement for System.Reflection and System.Diagnostics.
Assembly assembly = Assembly.GetExecutingAssembly();
List<string> embeddedResources = new List<string>(assembly.GetManifestResourceNames());
string assemblyName = new AssemblyName(args.Name).Name;
string fileName = string.Format("{0}.dll", assemblyName);
string resourceName = embeddedResources.Where(ern => ern.EndsWith(fileName)).FirstOrDefault();
if (!string.IsNullOrWhiteSpace(resourceName))
{
using (var stream = assembly.GetManifestResourceStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
var test = Assembly.Load(assemblyData);
string namespace_ = test.GetTypes().Where(t => t.Name == assemblyName).Select(t => t.Namespace).FirstOrDefault();
#if DEBUG
Debug.WriteLine(string.Format("\tNamespace for '{0}' is '{1}'", fileName, namespace_));
#endif
return Assembly.Load(assemblyData);
}
}
return null;
};
Чтобы сделать их доступными во время компиляции, я создаю папку с именем ExternalDLL и копирую туда dll и устанавливаю их в EmbeddedResource, как указано выше. Чтобы использовать их в своем коде, вам все равно нужно установить ссылку на них, но для параметра Копировать локально установить значение False. Чтобы заставить код правильно скомпилироваться без ошибок, вам также необходимо установить с помощью statments в вашем коде пространства имен dll.
Вот небольшая утилита, которая прокручивает имена встроенных ресурсов и отображает их пространства имен в окне вывода.
private void getEmbeddedResourceNamespaces()
{
// Note: Requires a using statement for System.Reflection and System.Diagnostics.
Assembly assembly = Assembly.GetExecutingAssembly();
List<string> embeddedResourceNames = new List<string>(assembly.GetManifestResourceNames());
foreach (string resourceName in embeddedResourceNames)
{
using (var stream = assembly.GetManifestResourceStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
try
{
var test = Assembly.Load(assemblyData);
foreach (Type type in test.GetTypes())
{
Debug.WriteLine(string.Format("\tNamespace for '{0}' is '{1}'", type.Name, type.Namespace));
}
}
catch
{
}
}
}
}