gaerelva 2024-07-10 10:33 采纳率: 83.3%
浏览 52
已结题

c#类库项目最终生成一个dll文件

问题一:建立一个 dll 类库项目,里面包含或者引用其他第三方 dll 或者 lib
在不使用工具的情况下,如何通过设置或者代码,直接最终打包成一个 dll 类库文件,不要生成第三方 dll 文件在 debug 文件夹拷贝 出来。
问题二,第三方 dll 文件 引用不成功,提示不是有效程序集或 com 组件 ,只能通过代码 dllimport 使用的 dll,如何一起打包这样的 dll

  • 写回答

26条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-07-10 11:08
    关注

    🕖上午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:尽挹西江沧溟,步行云,青虹影深。扣舷独舒啸,肝胆冰雪,了无尘心。

    C# 类库项目打包第三方 DLL 解决方案

    问题一:将第三方 DLL 打包到最终输出的 DLL 文件

    您可以使用 ILMerge 或 Costura.Fody 等工具将第三方 DLL 合并到您的主 DLL 中。但是,如果您想避免使用第三方工具,则可以使用嵌入式资源方法。

    步骤:

    1. 将第三方 DLL 添加为嵌入式资源:

      • 在 Visual Studio 解决方案资源管理器中,右键单击您的项目,然后选择“添加”>“现有项”。
      • 选择要添加的第三方 DLL 文件。
      • 在“属性”窗口中,将“生成操作”设置为“嵌入的资源”。
    2. 在代码中加载嵌入式 DLL:

      using System;
      using System.Reflection;
      using System.IO;
      using System.Runtime.InteropServices;
      
      public class MyClass
      {
          [DllImport("MyThirdPartyDll.dll")] // 使用 DLL 的名称,而不是完整路径
          public static extern void MyThirdPartyFunction();
      
          public static void Main()
          {
              // 获取嵌入式资源的程序集
              Assembly currentAssembly = Assembly.GetExecutingAssembly();
      
              // 替换 "YourProjectName.MyThirdPartyDll.dll" 为实际的资源名称
              string resourceName = "YourProjectName.MyThirdPartyDll.dll";
      
              // 从嵌入式资源加载 DLL
              using (Stream stream = currentAssembly.GetManifestResourceStream(resourceName))
              {
                  if (stream == null)
                      throw new Exception("无法找到嵌入式资源: " + resourceName);
      
                  byte[] assemblyData = new byte[stream.Length];
                  stream.Read(assemblyData, 0, assemblyData.Length);
      
                  // 加载程序集
                  Assembly loadedAssembly = Assembly.Load(assemblyData);
      
                  // 现在您可以使用加载的程序集中的类型和方法
                  MyThirdPartyFunction();
              }
          }
      }
      

      注意:

      • YourProjectName.MyThirdPartyDll.dll 替换为您的项目名称和 DLL 文件名,中间用 . 分隔。
      • 使用 DllImport 属性时,使用 DLL 的名称,而不是完整路径。

    问题二:使用 DllImport 引用的 DLL 打包

    如果您使用 DllImport 属性引用第三方 DLL,则该 DLL 必须存在于最终用户的系统上。您无法将使用 DllImport 引用的 DLL 直接嵌入到您的主 DLL 中。

    解决方法:

    1. 将第三方 DLL 放在最终用户的系统上:

      • 您可以将 DLL 放在与您的主应用程序相同的目录中。
      • 您也可以将 DLL 放在系统路径中的某个位置。
    2. 使用 SetDllDirectory 函数指定 DLL 的位置:

      using System.Runtime.InteropServices;
      
      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
      [return: MarshalAs(UnmanagedType.Bool)]
      static extern bool SetDllDirectory(string lpPathName);
      
      // ...
      
      // 在调用 DllImport 方法之前设置 DLL 目录
      string dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "libs");
      if (!SetDllDirectory(dllPath))
      {
          // 处理错误
      }
      

      注意:

      • SetDllDirectory 函数需要在调用任何使用 DllImport 属性的函数之前调用。

    总结:

    • 您可以使用嵌入式资源方法将一些第三方 DLL 打包到您的主 DLL 中。
    • 对于使用 DllImport 引用的 DLL,您需要确保它们存在于最终用户的系统上,并使用 SetDllDirectory 函数或其他方法指定 DLL 的位置。

    希望这些信息对您有所帮助!如果您有任何其他问题,请随时提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(25条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月19日
  • 已采纳回答 7月15日
  • 赞助了问题酬金15元 7月10日
  • 修改了问题 7月10日
  • 展开全部

悬赏问题

  • ¥15 TeleScan不能修改bar
  • ¥100 请问我基于逐飞库写的这个有关于mp u6050传感器的函数,为什么输出的值是固定的?
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息
  • ¥15 Spring Boot离线人脸识别
  • ¥15 使用Ant Design Pro vue的时候,使用环境变量的时候,构建报错是什么原因
  • ¥15 NRF24L01能发送但是不能接收
  • ¥15 想问一下这种情况怎么解决呢(关键词-file)