DLL 在子文件夹中而不是在应用程序文件夹中

Posted

技术标签:

【中文标题】DLL 在子文件夹中而不是在应用程序文件夹中【英文标题】:DLL in sub folder rather than in application folder 【发布时间】:2011-09-29 10:05:52 【问题描述】:

已经使用 VC++ 创建了一个动态 python 文件 (pyd)。使用 cx_freeze,我创建了一个 exe。为了让这个程序在其他计算机上运行,​​我需要在应用程序文件夹中有一个文件 msvcr100.dll。我确实得到了想要的输出。

但是,Microsoft 的分发许可证明确规定 dll 文件应位于应用程序文件夹内的子文件夹中。子文件夹应命名为“Microsoft.VC100.CRT”。我尝试通过更改项目属性来玩弄 MS VC++ 中的设置。事实证明它非常棘手,因为我使用 MSVC++ 的唯一一件事是让我的 python 程序使用一些 c 选项并返回一些我可以在我的 python 程序中再次使用的输出。我玩过清单文件(嵌入和不嵌入),还在 VC++ 中设置了 Additional Libraries Directory

任何人都知道我可以做些什么来让我的 pyd 文件查看 Microsoft.VC100.CRT。

【问题讨论】:

附加库条目用于静态链接,不指定运行时搜索的路径。 【参考方案1】:

我不确定何时在您的脚本中加载 DLL,但假设它已延迟到您可以对其进行处理的地步,那么您可以自己加载库:

import os
import ctypes
try:
    here = os.path.dirname(__file__)
except NameError:
    here = os.getcwd()
dll = ctypes.CDLL(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll'))
del here

或pywin32

import os
import win32api
try:
    dll = win32api.LoadLibrary('msvcr100.dll') #Never hurts to try
except win32api.error:
    try:
        here = os.path.dirname(__file__)
    except NameError:
        here = os.getcwd()
    #Just to prove messing with PATH does something.
    os.environ['PATH'] = os.environ['PATH'] + os.pathsep + os.path.join(here, 'Microsoft.VC100.CRT')
    dll = win32api.LoadLibrary('msvcr100.dll') #Give it another crank of the handle.
    #Or alternatively without messing with PATH
    dll = win32api.LoadLibrary(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll')) #Give it another alternative crank of the handle.
    del here

【讨论】:

修复了 eryksun 的 cmets 谢谢华夫蛋奶酥。我已经意识到问题所在了。请参阅下面的评论以获取解决方案。您的解决方案可能是正确的。但下面的一个对我有用【参考方案2】:

我创建的动态 python 文件是使用 Visual C++ 2010 编译的。因此,为了使其工作,需要 MSVCR100.dll 文件。 然而,由于我还为我的最终程序创建了一个应用程序 (.exe),它依赖于 MSVCR90.dll。 由于 Microsoft 坚持这些 dll 应位于具有特定名称的文件夹中,因此我不能将这些文件放在应用程序文件夹中。因此,我所做的是使用 Visual C++ 2008 编译 pyd 文件。然后添加 MSVCR90.dll 文件以及相应的清单和 MSVCP90.dll 和 MSVCM90.dll 文件。这样就解决了问题。

我的猜测是,在我的程序运行之前需要两代 C 运行时文件。通过使用 VC++2008 编译 pyd 文件,我有效地将依赖关系减少到了一代。

【讨论】:

以上是关于DLL 在子文件夹中而不是在应用程序文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

我想在详细信息页面中而不是在 AspNetCore Web 应用程序的索引页面中构建列

RESTful API:在请求正文中而不是在 URI 中传递父资源定位器是不是更实用?

仅在 JWT 令牌中而不是在 OAuth2 令牌中添加附加信息

离子v3在应用程序中进行制造和更新,以更新它在数据库中而不是在应用程序中正在更新的数据

csharp 通用检查器类,它允许您在类文件中而不是在单独的自定义编辑器中实现OnScene / InspectorGUI。它也提供

将数组传输到SQLite中,反之亦然,而无需循环,尤其是在ActionScript3中而不循环