我有一个 .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_DIRS
或LOAD_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/