如何C windows dll合并到一个C#应用程序exe?

我有一个Windows C#程序,使用C dll的数据i / o。我的目标是将应用程序部署为单个EXE。

创建这样的可执行文件的步骤是什么?

最佳答案
单个组件部署管理和非托管代码
2007年2月4日星期日

.NET开发人员喜欢XCOPY部署。他们喜欢单个装配组件。至少我总是觉得有点不安,如果我必须使用一些组件,并需要记住一个文件列表,也包括该组件的主要组件。所以当我最近不得不开发一个托管代码组件,并不得不增加它的一些非托管代码从一个C DLL(thx到Marcus Heege帮助我这个!),我想了如何使它更容易部署两个DLL 。如果这只是两个程序集,我可以使用ILmerge在一个文件中打包。但是这不适用于具有受管以及非受管DLL的混合代码组件。

所以这里是我想出了一个解决方案:

我包括我想要部署与我的组件的主要组件作为嵌入式资源的任何DLL。
然后我设置一个类构造函数来提取这些DLL,如下所示。类ctor在每个AppDomain中只调用一次,所以它是一个可忽略的开销,我想。

namespace MyLib
{
    public class MyClass
    {
        static MyClass()
        {
            ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
            ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
        }

        ...

在这个例子中,我包括两个DLL作为资源,一个是非托管代码DLL,一个是托管代码DLL(仅用于演示目的),以显示这种技术如何适用于这两种代码。

将DLL解压到自己的文件中的代码很简单:

public static class ResourceExtractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
            using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
                {
                    byte[] b = new byte[s.Length];
                    s.Read(b, 0, b.Length);
                    fs.Write(b, 0, b.Length);
                }
    }
}

使用像这样的托管代码组件是一样的 – 几乎。你在组件的主项目(这里:MyLib)中引用它(这里:ManagedService.dll),但将Copy Local属性设置为false。此外,您将该程序集链接为现有项目,并将构建操作设置为嵌入式资源。

对于非托管代码(这里是:UnmanagedService.dll),您只需将DLL链接为现有项目,并将构建操作设置为嵌入式资源。要访问它的函数,像往常一样使用DllImport属性,例如。

[DllImport("unmanagedservice.dll")] public extern static int Add(int a, int b);

而已!一旦使用静态ctor创建类的第一个实例,嵌入式DLL将被提取到自己的文件中,并且可以像部署为单独的文件一样准备使用。只要你有执行目录的写入权限,这应该工作正常为你。至少对于原型代码我认为这种单组件部署的方式是相当方便的。

请享用!

http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx

转载注明原文:如何C windows dll合并到一个C#应用程序exe? - 代码日志