Загрузить сборку из встроенного ресурса - PullRequest
7 голосов
/ 01 августа 2011

Я хотел бы загрузить файл dll (Test.dll) как сборку.Я могу сделать это, используя как прямые ссылки на Visual Studio (т. Е. Загрузив dll как ссылку на мое приложение на C #), так и загрузив dll, используя метод Assembly.LoadFile(filename).Теперь я хотел бы добавить свой dll-файл как встроенный ресурс в мое приложение Visual Studio и загрузить dll-файл как сборку.Я знаю, как загрузить этот ресурс как байтовый массив, есть ли какая-то корреляция между байтовым массивом и сборкой, которую я мог бы использовать?Кроме того, мне нужно иметь возможность вызывать метод, расположенный в файле DLL.Посмотрите код ниже - он объяснит мне, что я делаю.

Assembly SampleAssembly = Assembly.LoadFrom("WindowsFormsApplication2.ThisisaTESTDLL.dll");
Type myType = SampleAssembly.GetTypes()[0];
MethodInfo Method = myType.GetMethod("myVoid");
object myInstance = Activator.CreateInstance(myType,null);
Method.Invoke(myInstance,new object[] { "param1", "param1"});

Если я что-то здесь упустил, пожалуйста, с уважением, дайте мне знать, и я отредактирую исходное сообщение.

Ответы [ 2 ]

6 голосов
/ 01 августа 2011

Assembly.GetExecutingAssembly (). GetManifestResourceStream (...)

Это должно дать вам объект Stream. Вы можете прочитать байтовый массив из этого.

Вы можете загрузить это, используя Assembly.Load

3 голосов
/ 05 сентября 2015

Я встроил AxInterop.WMPLib.dll и Interop.WMPLib.dll в свой exe и загрузил их, используя следующий код. Код находится в начале статического void Main () в файле Program.cs. Целевой фреймворк - это .NET 3.5 в моем случае. Этот код помог мне собрать dll в сам exe без необходимости развертывать их через установщики. Я жестко закодировал свои имена. В приведенном ниже коде "res" - это имя моего ресурса "res.resx", который содержит две встроенные библиотеки.

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(    
(s, a) =>
{
    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "AxInterop.WMPLib")
    {
        return Assembly.Load(res.AxInterop_WMPLib);
    }

    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "Interop.WMPLib")
    {
        return Assembly.Load(res.Interop_WMPLib);
    }

    return null;
});
...