从嵌入式资源加载程序集

本文关键字:程序集 加载 资源 嵌入式 | 更新日期: 2023-09-27 18:04:10

我想加载一个dll文件(Test.dll)作为程序集。我能够使用这两个直接的Visual Studio引用(即。加载dll作为我的c#应用程序的引用)以及使用Assembly.LoadFile(filename)方法加载dll。现在,我想将我的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"});

如果我在这里遗漏了什么,请让我知道,我将编辑原始帖子。

从嵌入式资源加载程序集

Assembly.GetExecutingAssembly().GetManifestResourceStream(…)

应该会得到一个Stream对象。你可以从中读取一个字节数组

可以使用Assembly加载。负载

我将AxInterop.WMPLib.dll和Interop.WMPLib.dll嵌入到我的exe中,并使用以下代码加载它们。该代码位于Program.cs文件中静态void Main()的开头。在我的例子中,目标框架是。net 3.5。这段代码帮助我将dll捆绑到exe本身,而不必通过安装程序部署它们。我已经把我的名字硬编码了。在下面的代码中,"res"是我的资源"res.resx"的名称,其中包含两个嵌入的dll。

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;
});