当前位置 博文首页 > 文章内容

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

    作者:shunshunshun18 栏目:未分类 时间:2021-12-28 15:26:03

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    托管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复制到其它路径,可以正常运行