问题一:建立一个 dll 类库项目,里面包含或者引用其他第三方 dll 或者 lib
在不使用工具的情况下,如何通过设置或者代码,直接最终打包成一个 dll 类库文件,不要生成第三方 dll 文件在 debug 文件夹拷贝 出来。
问题二,第三方 dll 文件 引用不成功,提示不是有效程序集或 com 组件 ,只能通过代码 dllimport 使用的 dll,如何一起打包这样的 dll
c#类库项目最终生成一个dll文件
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
26条回答 默认 最新
关注 🕖上午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:尽挹西江沧溟,步行云,青虹影深。扣舷独舒啸,肝胆冰雪,了无尘心。C# 类库项目打包第三方 DLL 解决方案
问题一:将第三方 DLL 打包到最终输出的 DLL 文件
您可以使用 ILMerge 或 Costura.Fody 等工具将第三方 DLL 合并到您的主 DLL 中。但是,如果您想避免使用第三方工具,则可以使用嵌入式资源方法。
步骤:
-
将第三方 DLL 添加为嵌入式资源:
- 在 Visual Studio 解决方案资源管理器中,右键单击您的项目,然后选择“添加”>“现有项”。
- 选择要添加的第三方 DLL 文件。
- 在“属性”窗口中,将“生成操作”设置为“嵌入的资源”。
-
在代码中加载嵌入式 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 中。解决方法:
-
将第三方 DLL 放在最终用户的系统上:
- 您可以将 DLL 放在与您的主应用程序相同的目录中。
- 您也可以将 DLL 放在系统路径中的某个位置。
-
使用
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 的位置。
希望这些信息对您有所帮助!如果您有任何其他问题,请随时提出。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报-
悬赏问题
- ¥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)