c# - 将 native dll 和其他文件添加到 .net exe

标签 c# .net dll com

我有一个 .NET 应用程序,它依赖于 COM dll,该 dll 通过免注册表激活(并排)加载,然后通过 P/Invoke 访问。 COM dll 还需要一些数据库文件才能正常工作。

现在我正在尝试将所有文​​件合并到一个 exe 中,但我不知道如何操作。

ILMerge 和类似的将不起作用,因为 COM dll 是 native 的(非托管)。

一种可能性是将 dll 及其文件作为嵌入式资源保存并在启动时将它们写入文件系统。 (如 this Stackoverflow 问题的答案)。

但是,我不想让应用程序在启动时执行此操作。

有人知道如何轻松地将 COM dll 及其文件添加到应用程序中,然后通过免注册表激活加载它吗?

顺便说一句:显然我也可以单独注册 COM dll(在注册表中),然后从应用程序中使用它,但是,这对我来说不是一个选择。

最佳答案

你不能直接做你想做的事,你的DLL必须是实际的文件。

但是,您可以将 DLL 从资源中提取到临时目录中,然后使用以下技术之一来影响 DLL search :

  • 调用 SetDefaultDllDirectories至少 LOAD_LIBRARY_SEARCH_USER_DIRSLOAD_LIBRARY_SEARCH_DEFAULT_DIRS,然后调用 AddDllDirectory将临时目录添加到 DLL 搜索路径

  • 如果您无法使用 GetProcAddress 找到以前的函数(例如带有 KB 2533623 或 SP1 的 Win7 之前的版本),请调用 SetDllDirectory将临时目录添加到 DLL 搜索路径

  • 如果您无法使用GetProcAddress找到上一个函数(例如WinXP SP1之前的版本),可以将当前目录设置为临时目录(我不推荐这个)或者将其添加到 PATH 环境变量中的目录列表

我不建议更改当前目录的原因是,某些 DLL 初始化可能会出于某种原因捕获当前目录,并且它将是临时 DLL 目录,而不是预期的目录。

如果您还提取可执行文件,则将目录添加到 PATH 可能会产生后果。

我之所以包含最后一个选项,是因为它适用于无法调用任意 Win32 函数的有限环境,但您可以更改 PATH 环境变量或更改当前目录。

关于c# - 将 native dll 和其他文件添加到 .net exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25200605/

相关文章:

c# - LINQ 中不同版本的 Intersect()

c# - 长类型的 Lambda 排序

asp.net - 在ASP.NET中长时间运行的后台进程-Application_Start还是单独的进程?

c++ - 如何使 *.dll WinAmp 插件在 friend 的电脑上工作

使用 Microsoft Visual Studio 在 Windows 64 位上为 PostgreSQL 数据库创建 C 函数 dll

无法将全局变量从 dll 导入到应用程序中?

c# - 在每个类中调用相同方法的最佳方法是什么?

C# 中的 JavaScript

c# - 从另一个 Controller 调用信号器

C# 与 Express : "This method is reserved for future use" - what does it mean?