从嵌入式资源加载程序集

时间:2011-07-31 23:36:21

标签: c# visual-studio dll resources

我想加载一个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"});

如果我在这里遗漏任何内容,请尊敬地告诉我,我会编辑原帖。

2 个答案:

答案 0 :(得分:6)

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

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

您可以使用Assembly.Load

加载它

答案 1 :(得分:3)

我将AxInterop.WMPLib.dll和Interop.WMPLib.dll嵌入到我的exe中,并使用以下代码加载它们。代码放在Program.cs文件中静态void Main()的开头。在我的案例中,目标框架是.NET 3.5。这段代码帮助我将dll捆绑到exe本身,而无需通过安装程序进行部署。我硬编了我的名字。在下面的代码中,“res”是包含两个嵌入式dll的资源“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;
});