我正在为外部应用程序开发大量C ++插件dll(如果需要的话,可以将Visual Studio 2017与2015工具链一起使用)。这些插件又共享许多代码,因此我将其放在名为common.inc的自己的通用dll文件中(我不能在其上使用.dll扩展名,否则主机应用会将其误认为是常规插件)。我更愿意将此通用dll文件放在其他插件dll旁边,以便于分发。需要通过加载时链接来插入common.inc,即不需要通过手动LoadLibrary / GetProcAddress调用(进入common.inc的入口太多,无法包装)。
这应该是开箱即用的,如果不是因为主机应用程序在这里不能正常运行的事实。主机应用似乎针对找到的插件使用了平坦的LoadLibrary,指定了插件的完整路径,并且不费心将当前目录设置为插件文件夹,也没有使用LoadLibraryEx指定其他搜索路径等。结果是我的插件dll可能无法链接到它们旁边的common.inc。
我不想用主机应用程序的插件文件夹污染路径env var,也不想将common.inc安装到主机应用程序的安装文件夹或(关闭)Windows文件夹中。到目前为止,我的解决方案是在加载插件dll时使用清单文件将Windows加载程序定向到common.inc,并在其中定义一个带有common.inc的私有程序集。
我让它工作了,但是这样(足够)是不好的。我目前将common.inc放置在插件旁边的“ CommonFolder”文件夹中,并将CommonFolder.manifest放置在该文件夹中,并在其中放置common.inc。我假设这是一种多文件程序集设置,但仅使用1个文件。我想在一个真正的单文件程序集中对其进行变形,以摆脱多余的文件夹+外部清单文件,但我似乎无法使其正常工作。
到目前为止,可行的是:
plugin.dll的嵌入式清单(@ ID 2):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="CommonFolder" version="1.0.0.0"></assemblyIdentity>
</dependentAssembly>
</dependency>
<...trustinfo section left out...>
</assembly>
CommonFolder的内容:
CommonFolder.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="CommonFolder" version="1.0.0.0" />
<file name="Common.inc" />
</assembly>
我无法解决的问题是:
plugin.dll的嵌入式清单(@ ID 2):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Common.inc" version="1.0.0.0"></assemblyIdentity>
</dependentAssembly>
</dependency>
<...trustinfo section left out...>
</assembly>
plugin.dll旁边的common.inc,带有嵌入式清单(@ ID 2):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="Common.inc" version="1.0.0.0"></assemblyIdentity>
<file name="Common.inc"></file>
<...trustinfo section left out...>
</assembly>
我可能在这里忙得不可开交,但是我不得不给自己一个速成班,以解决最初的清单文件是什么。既然我对清单很熟悉,它们实际上似乎是一个简单的概念,但是我可以谷歌搜索的所有文档似乎都无法以一种直截了当的方式来传达它(通常对它们来说太过笼统了,因此导致了稀释实际主题,或者仅列出所有可用的低级标志和XML标签,而没有将它们与高级概念正确关联。