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

前往我的主页以获得更好的阅读体验

C#(.Net) 将非托管dll嵌入exe中 - DearXuan的主页icon-default.png?t=M3K6https://blog.dearxuan.com/2021/12/26/C-Net-%E5%B0%86%E9%9D%9E%E6%89%98%E7%AE%A1dll%E5%B5%8C%E5%85%A5exe%E4%B8%AD/

托管dll与非托管dll

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

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

下载与安装

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

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

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

添加Dll

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

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

此时这个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

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

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

调用

直接使用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复制到其它路径,可以正常运行

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dear_Xuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值