我们的应用程序依赖于许多第三方DLL组。不幸的是,这些第三方DLL的编写者都没有一致地命名它们,所以很难看出哪个DLL属于哪个组。
为了尝试管理这个,我们希望将第三方DLL组放在我们的应用程序文件夹中的文件夹中,而不是像这样的应用程序旁边。
--> Application Folder
--> Application.exe
--> MyDLL1.dll
--> MyDLL2.dll
--> Third Party 1 DLL folder
--> Third Party 1 DLL 1.dll
--> Third Party 1 DLL 2.dll
--> Third Party 1 DLL 3.dll
--> Third Party 2 DLL folder
--> Third Party 2 DLL 1.dll
--> Third Party 2 DLL 2.dll
--> Third Party 2 DLL 3.dll
我的问题是如何让动态链接器找到它们并加载它们?
我们可以使用LoadLibrary()和GetProcAddress()手动执行此操作,但这非常繁琐。看起来我们可以通过清单和“探测”来做到这一点,但这似乎只是Windows 7(我们需要在XP及以上版本上工作)。
更新
我们最终使用清单来做到这一点(感谢@Chris) - 如果有人在寻找解决方案的话,还有其他一些我们不得不跳过的箍!
首先,我们的“程序集”实际上有几个DLL,我们链接到那个DLL然后链接到其他DLL。所有这些DLL都需要将程序集依赖项添加到它们的清单中(您可以使用mt.exe执行此操作而无需访问这些DLL的源代码)。
其次,程序集需要与DLL一起使用,而不是与EXE一起 - 我们的DLL实际上是一个已经存在于应用程序子文件夹中的插件。
这是我们的最终布局:
--> Application Folder
--> Application.exe
--> Plugins folder
--> MyDLL1.dll
--> Third Party 1
--> Third Party 1.manifest
--> A.dll
--> B.dll
--> C.dll
如果MyDLL1.dll是一个链接到A.dll的插件,而A.dll链接到B.dll和C.dll,那么:
对我来说,(3)有点恼火。您可能会认为链接器会在程序集中查找依赖DLL。
答案 0 :(得分:6)
你可以在没有探测的情况下进行清单。 创建“假”程序集 - 通过定义包含dll的.manifests。 (在这个dll中没有要求改变) 由于程序集支持已添加到NT 5.1(Windows XP),因此Windows加载程序首先通过扫描具有程序集名称的文件夹来查找程序集。
因此,例如,如果您需要为应用程序分发Visual C 2008的Microsoft Visual C运行时,则可以创建如下所示的文件夹结构:
--> Application Folder
--> Application.exe
--> MyDll1.dll
--> MyDll2.dll
--> Microsoft.VC90.CRT
--> Microsoft.VC90.CRT.manifest
--> msvcr90.dll
--> msvcp90.dll
--> msvcm90.dll
这个方案适用于你的第三方dll。 您需要做的就是将“假”程序集作为依赖程序集添加到应用程序的清单中(如果您的dll有清单,(并且它们访问第三方dll),那么它们的清单也必须有条目。 / p>
描述程序集的清单文件需要一个assemblyIdentity,每个dll需要一个文件节点:
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Assembly Name" version="1.0.0.0" processorArchitecture="x86" />
<file name="dll1.dll" />
<file name="dll2.dll" />
</assembly>
您的应用程序和dll是使用MS Visual Studio 2005或更高版本构建的,以下pragma指令将使您的应用程序查找程序集中的dll:
#pragma comment(linker, "/manifestDependency:\"name='Assembly Name' processorArchitecture='*' version='1.0.0.0' type='win32' \"")
答案 1 :(得分:1)
您可以使用SetDLLDirectory函数指定DLL的路径。或者,阅读有关使用application-specific paths的信息。