gpt4 book ai didi

c# - 如何将 C++ Windows dll 合并到 C# 应用程序 exe 中?

转载 作者:IT王子 更新时间:2023-10-29 04:08:16 25 4
gpt4 key购买 nike

我有一个 Windows C# 程序,它使用 C++ dll 进行数据输入/输出。我的目标是将应用程序部署为单个 EXE。

创建此类可执行文件的步骤是什么?

最佳答案

托管和非托管代码的单一程序集部署2007 年 2 月 4 日星期日

.NET 开发人员喜欢 XCOPY 部署。他们喜欢单一的装配组件。至少我总是觉得有点不安,如果我必须使用某个组件并且需要记住一个文件列表,以便包含在该组件的主程序集中。因此,当我最近不得不开发一个托管代码组件并且不得不用 C DLL 中的一些非托管代码来扩充它时(感谢 Marcus Heege 帮助我完成了这个!),我想到了如何更容易地部署这两个 DLL .如果这只是两个程序集,我可以使用 ILmerge 将它们打包到一个文件中。但这不适用于具有托管和非托管 DLL 的混合代码组件。

所以这是我想出的解决方案:

我将我想要部署的任何 DLL 作为嵌入式资源包含在我的组件的主程序集中。然后我设置了一个类构造函数来提取这些 DLL,如下所示。 class 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);

就是这样!一旦您使用静态构造函数创建该类的第一个实例,嵌入式 DLL 就会被提取到它们自己的文件中,并且可以像您将它们作为单独的文件部署一样使用。只要您对执行目录具有写权限,这就可以正常工作。至少对于原型(prototype)代码,我认为这种单一程序集部署方式非常方便。

尽情享受吧!

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

关于c# - 如何将 C++ Windows dll 合并到 C# 应用程序 exe 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com