从嵌入式资源加载程序集
Posted
技术标签:
【中文标题】从嵌入式资源加载程序集【英文标题】:Load an assembly from an embedded resource 【发布时间】:2011-10-17 02:36:54 【问题描述】:我想加载一个 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");
如果我在这里遗漏任何内容,请恭敬地告诉我,我将编辑原始帖子。
【问题讨论】:
【参考方案1】:Assembly.GetExecutingAssembly().GetManifestResourceStream(...)
这应该会给你一个 Stream 对象。你可以从中读取一个字节数组。
您可以使用 Assembly.Load 加载它
【讨论】:
我相信我在问题中已经说过,我已经能够读取字节数组了,有没有办法从这个字节数组中读取程序集? 这就是我听起来无知的地方......我阅读了 Assembly.Load 的文档,其中一个“重载”显示为“byte[]”。那么,为什么当我键入“Assembly.Load”时,VS 会说“字符串”作为参数?有什么方法可以指定吗? 有几个重载...您是否看到循环浏览重载列表的箭头?您也可以尝试使用 resharper 或 devexpress 提供的工具。它们大大提高了智力。 哦!我从来没有注意到这一点!非常感谢!【参考方案2】:我将 AxInterop.WMPLib.dll 和 Interop.WMPLib.dll 嵌入到我的 exe 中,并使用以下代码加载它们。该代码位于 Program.cs 文件中 static 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;
);
【讨论】:
以上是关于从嵌入式资源加载程序集的主要内容,如果未能解决你的问题,请参考以下文章
如何将 HTML/JavaScript 从嵌入式资源加载到 winform Web 浏览器