首页 / 知识
如何将C ++ Windows dll合并到C#应用程序exe中?
2023-04-15 22:17:00

How can a C++ windows dll be merged into a C# application exe?我有一个Windows C#程序,该程序使用C ++ dll进行数据I / O。 我的目标是将应用程序部署为单个EXE。 创建此类可执行文件的步骤是什么?
托管和非托管代码的单程序集部署 .NET开发人员喜欢XCOPY部署。而且他们喜欢单一装配部件。如果我必须使用某个组件并且需要记住一个文件列表,该文件也要包含在该组件的主程序集中,至少我总会感到不安。因此,当我最近不得不开发托管代码组件并用来自C DLL的一些非托管代码对其进行扩充时(向Marcus Heege表示感谢,以帮助我解决这个问题!),我想到了如何简化两个DLL的部署。 。如果这只是两个程序集,我本可以使用ILmerge将它们打包在一个文件中。但这不适用于具有托管和非托管DLL的混合代码组件。 所以这是我想出的解决方案:
我将要与组件主装配一起部署的所有DLL都包含在内,作为嵌入式资源。
在此示例中,我包括两个DLL作为资源,一个是非托管代码DLL,一个是托管代码DLL(仅用于演示目的),以说明该技术如何在两种代码中起作用。 将DLL提取到自己的文件中的代码很简单:
像这样使用托管代码程序集与平常相同-几乎一样。您在组件的主项目(此处为MyLib)中引用它(此处为ManagedService.dll),但是将"复制本地"属性设置为false。另外,您可以在装配中将其链接为现有项,并将"生成操作"设置为"嵌入式资源"。 对于非托管代码(在这里:UnmanagedService.dll),您只需将DLL作为现有项链接,然后将"生成操作"设置为"嵌入式资源"。要访问其功能,请照常使用DllImport属性,例如
而已!一旦使用静态ctor创建该类的第一个实例,嵌入式DLL就会被提取到它们自己的文件中,并可以像将它们作为单独的文件部署一样使用。只要您对执行目录具有写许可权,这对您就可以正常工作。至少对于原型代码,我认为这种单程序集部署方式非常方便。 请享用! http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx 使用Fody.Costura nuget 而已 !
尝试boxedapp;它允许从内存加载所有DLL。另外,似乎您甚至可以嵌入.net运行时。创建一个真正独立的应用程序非常好...
只需在Visual Studio中右键单击您的项目,然后选择项目属性->资源->添加资源->添加现有文件…
这是我的原始博客文章:
您是否尝试过ILMerge? http://research.microsoft.com/~mbarnett/ILMerge.aspx
如果要使用
但是,它不适用于普通(本机)Windows DLL。 智能装配可以完成更多任务。如果您的dll具有不受管的代码,则它不会让您将dll合并到单个程序集中,而是可以将所需的依赖项作为资源嵌入到主exe中。它的另一面,不是免费的。
您可以通过将dll嵌入到资源中,然后依靠AppDomain的Assembly
此处的关键是将字节写入文件并从文件位置加载。为了避免出现鸡蛋问题,您必须确保在访问程序集之前声明处理程序,并且不要在装入(程序集解析)零件中访问程序集成员(或实例化必须处理该程序集的任何内容)。还要注意确保 如果程序集完全不受管,则可以看到此链接或有关如何加载此类dll的信息。 Thinstall是一种解决方案。对于本机Windows应用程序,我建议将DLL嵌入为二进制资源对象,然后在需要时在运行时将其提取。 Xenocode的PostBuild可以将托管和非托管打包到一个exe中。 |
最新内容
相关内容
linux储存命令数据?
linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,linux常用命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux储存命令数据?
linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,linux常用命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux命令大全数据库?
linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,在Linux上用命令怎么连接数据库(linux连接oracle数据库命令)登录linux上数据库的命令?
linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,在Linux上用命令怎么连接数据库(linux连接oracle数据库命令)1、登linux命令dm数据库?
linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,linux创建dm数据库超时linux/sys下无法新建 方法如下打开c盘,在用户linux存储数据命令?
linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Linux文件系统操作命令1、cat:可以显示文件的内容(经常和more搭配使linux数据库查找命令?
linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,在linux中如何用命令查找文件在哪使用查找命令 “find”命令允许linux输入命令的步骤?
linux输入命令的步骤?,系统,工作,命令,发行,第三,数字,时间,管理,首开,基础,linux中使用vi指令后怎么输入?[Ctrl]+[f]:屏幕向下移动一页,相当于[linux数据库同步命令?
linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,DB2数据库在linux操作系统的指令有哪些?1、linux系统常用操作命令linux下载步骤命令?
linux下载步骤命令?,系统,软件,网络,电脑,官网,名称,管理,工具,位置,盘中,安装Linux系统的步骤是什么1、安装 Linux 的步骤如下:准备一个可启动linux建立数据库命令?
linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服务,linux中在shell中怎么创建一个数据库1、以下的文章主要讲述的是linux命令进数据库?
linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,主机,linux系统mysql数据库怎么进入数据库首先确保linux下mysql安