Chr*_*cke 18
我的第一个想法是,如果你静态链接一个DLL,它不是一个插件.只需将dll放在EXE文件夹中即可完成.这是静态加载的DLL的Windows支持的部署配置.
也就是说,有办法实现你想要的.但他们大多是愚蠢的,或者没有充分理由的复杂:你的选择是:
要将文件夹(一个或多个dll)转换为"程序集",只需将文件添加到文件夹name.manifest的文件夹中即可.
所以,plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
Run Code Online (Sandbox Code Playgroud)
确保文件夹和dll的名称不同,这是一个非常好的主意,好像dll名称是程序集名称windows开始查看其嵌入式清单文件以获取有关程序集的信息.
假设您使用的是Visual Studio 7或更高版本,则在项目中添加到.c/.cpp或.h文件的以下指令将使您的应用程序尝试从程序集而不仅仅是本地目录加载dll:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")
Run Code Online (Sandbox Code Playgroud)
旁注:克里斯还有两篇关于更多细节的优秀写作:
这也解释了如何利用probing privatePath应用程序配置文件将DLL放在子文件夹之外.
这实际上称为"私人程序集",MS文档以这种方式解释:
专用程序集安装在应用程序目录结构的文件夹中.通常,这是包含应用程序可执行文件的文件夹.私有程序集可以部署在与应用程序相同的文件夹中,与程序集同名的文件夹中,也可以部署在与程序集同名的特定于语言的子文件夹中.
例如 (...)
Appdir\Microsoft.Tools.Pop\Microsoft.Tools.Pop.MANIFEST:清单在具有程序集名称的子文件夹中部署为单独的文件.(......)
可以通过任何可以将程序集的文件复制到此文件夹的安装方法来安装专用程序集,例如
xcopy命令.
你在程序文件夹中得到了可靠的旧可执行文件C:\Test\Program\app.exe,你想 - 在加载时 - 从Plugins子文件夹加载你的DLL文件,即C:\Test\Program\plugins\tool1.dll 没有搞乱PATH或任何其他的东西.
你需要:
使用以下命令编译app.exe:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' version='1.0.0.0' type='win32'\"")
// name, type and version seems to be the minimum info to get away with
Run Code Online (Sandbox Code Playgroud)
注意:app.exe.manifest我的测试系统需要编译/链接它,而不是使用外部清单(),我还没有找到原因.(*一个)
然而,也可以使用mt工具将下面列出的清单文件嵌入/合并到可执行文件中,而不是使用链接器编译指示.(Configuration > Manifest Tool > Additional Manifest Files)
把tool1.dll放在plugins子文件夹中
C:\Test\Program\plugins\plugins.manifest一个看起来像这样:plugins.manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="Plugins"
version="1.0.0.0"
/>
<file name="tool1.dll"/>
</assembly>
Run Code Online (Sandbox Code Playgroud)
而已.启动app.exe将在Load-Time自动在子文件夹中找到dll.
(*a):合并此清单文件有效,但您不能将其用作唯一的外部清单文件,我怀疑这是因为它缺少构建系统已经放入可执行文件的所有其他清单信息!
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<!-- Note: type: The value must be win32 and all in lower case. Required. -->
<!-- Note: version: The value must be win32 and all in lower case. Required. -->
<assemblyIdentity
type="win32"
name="plugins"
version="1.0.0.0"
/>
</dependentAssembly>
</dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8418 次 |
| 最近记录: |