如何将第三方Windows DLL组织到应用程序文件夹中的子文件夹中?
我们有一个应用程序,它依赖于许多第三方DLL组.不幸的是,这些第三方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,那么: >“第三方1.显示”需要包括所有A.dll,B.dll和C.dll作为程序集 对我来说,(3)有点恼火.您可能会认为链接器会在程序集中查找依赖DLL. 解决方法
您无需探测即可使用清单进行操作.
创建“假”程序集 – 通过定义包含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. 描述程序集的清单文件需要一个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' "") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – 无法完全删除git存储库
- 如何在Windows Phone上更改C#中的本地化?
- Windows安装程序 – 在CMake CPack NSIS中创建Windows桌面图
- windows – 如何查找本地用户帐户的创建日期?
- windows – 尝试从Vim编译和调试C语言
- dll – regsvr32不会在注册表中创建任何条目
- 在Microsoft技术堆栈上构建SOA
- kvm-virtualization – 为什么空闲的Windows VM使用这么多C
- TypeScript编译器在Windows上使用什么JavaScript引擎?
- windows-server-2003 – 如何设置Windows Server 2003以通知