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

托管dll与非托管dll

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

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

下载与安装

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

C#(.Net)将非托管dll嵌入exe中的实现_第1张图片

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

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

C#(.Net)将非托管dll嵌入exe中的实现_第2张图片

添加Dll

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

C#(.Net)将非托管dll嵌入exe中的实现_第3张图片

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

C#(.Net)将非托管dll嵌入exe中的实现_第4张图片

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

dll名称为: PicSizer_CUDA.dll

dll位数为: 64位

修改XML文件



  
  
    
      PicSizer_CUDA
    
  

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

在项目中创建文件夹: Costura64

如果是32位同理改为32

C#(.Net)将非托管dll嵌入exe中的实现_第5张图片

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

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

C#(.Net)将非托管dll嵌入exe中的实现_第6张图片

调用

直接使用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 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(C#(.Net)将非托管dll嵌入exe中的实现)