欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#(.Net)将非托管dll嵌入exe中的实现

程序员文章站 2022-03-01 21:25:33
目录托管dll与非托管dll下载与安装添加dll调用编译托管dll与非托管dll托管dll实际上是指c#编写的dll,可以直接右键“引用”导入而大部分情况下,我们需要引用c++写的dll,如果你的dl...

托管dll与非托管dll

托管dll实际上是指c#编写的dll,可以直接右键“引用”导入

而大部分情况下,我们需要引用c++写的dll,如果你的dll是使用 dllimport来导入的,那么它就属于非托管dll,这种dll无法直接嵌入exe中,需要借助工具:costura.fody,该工具可以使用vs直接下载

下载与安装

右键引用,选择“管理nuget程序包”,搜索 "fody"

C#(.Net)将非托管dll嵌入exe中的实现

 点击costure.fody,选择右边详情栏内的“安装”按钮

检查“引用”,发现costura已经加入到项目中

C#(.Net)将非托管dll嵌入exe中的实现

添加dll

右键 解决方案-“添加”-“新建项”

C#(.Net)将非托管dll嵌入exe中的实现

 新建如图所示的xml文件(如果自动生成了就不需要新建): fodyweavers.xml

C#(.Net)将非托管dll嵌入exe中的实现

此时这个xml文件会被添加到项目根目录,以我的dll为例

dll名称为: picsizer_cuda.dll

dll位数为: 64位

修改xml文件

<?xml version="1.0" encoding="utf-8"?>
<weavers
  xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
  xsi:nonamespaceschemalocation="fodyweavers.xsd">
  
  <costura>
    <unmanaged64assemblies>
      picsizer_cuda
    </unmanaged64assemblies>
  </costura>
</weavers>

注意:不要有后缀名,如果是32位只需要把“64”改成“32”

在项目中创建文件夹: costura64

如果是32位同理改为32

C#(.Net)将非托管dll嵌入exe中的实现

把dll复制到该文件夹中,在生成时,会自动寻找 costura64和costura32文件夹中的dll

将dll设置为“嵌入的资源”

C#(.Net)将非托管dll嵌入exe中的实现

调用

直接使用dllimport用平常的方式调用即可

const string dll_path = "picsizer_cuda.dll";
 
[dllimport(dll_path, entrypoint = "setbrightness", callingconvention = callingconvention.cdecl)]
public static extern bool setbrightness(intptr ori, int length, byte dark);
 
[dllimport(dll_path, entrypoint = "isgpusupport", callingconvention = callingconvention.cdecl)]
public static extern bool isgpusupport();

编译

重新编译出exe,将exe复制到其它路径,可以正常运行

到此这篇关于c#(.net)将非托管dll嵌入exe中的实现的文章就介绍到这了,更多相关c#将非托管dll嵌入exe 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!