【问题标题】:Mixed Mode Library and CRT Dependencies - HELP混合模式库和 CRT 依赖项 - 帮助
【发布时间】:2010-09-18 20:17:34
【问题描述】:

好吧,经过大量研究并尝试了几乎所有我能找到的托管 CPP Redist 以及尝试将我的 DLL 本地复制到应用程序的执行目录后,我无法弄清楚我缺少哪些依赖项。模式库。

基本上我有一个大型 C# 应用程序,我正在尝试使用我制作的混合模式库。在开发机器上,它可以完美运行(当然),但在需要加载库以供使用时部署它会因为缺少 CRT 依赖项而出现异常(我假设)。

我已经使用依赖项遍历器检查所有引用的 DLL,并确保它们存在于部署机器上,但没有运气,我想知道是否可能是我缺少一些需要注册的依赖项,但我不能弄清楚什么。

当代码尝试从混合模式库中实例化一个类时,出现以下异常。

异常详情: System.IO.FileLoadException:不能 加载文件或程序集'USADSI.MAPI, 版本=1.0.3174.25238, 文化=中立,PublicKeyToken=null' 或其依赖项之一。这 应用程序无法启动 因为应用程序配置 是不正确的。重新安装 应用程序可能会解决此问题。 (HRESULT 异常:0x800736B1)

我正在使用 VS2008 SP1 编译库,并指定了 /clr:oldSyntax。

中间清单如下所示:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

我可以根据需要提供更多信息,不幸的是我不擅长制作混合模式库,所以这让我很失望。

如果有人能提供任何建议,我将不胜感激!

【问题讨论】:

    标签: mixed-mode dependencies c++ c# .net


    【解决方案1】:

    您是否在目标机器上部署了CRT libraries?远景:由于您依赖于 32 位代码,因此您应该将 Build 属性选项卡中的 Target Platform 设置为 x86。

    编辑:使用 Sxstrace.exe utility 解决问题并排解决问题,可在 Vista 上使用。

    【讨论】:

    • 是的,我尝试了一些不同的 CRT Redist,但没有任何运气,并且库的构建配置设置为 win32。嘿,开始把我的头发拉出来了,哈哈
    【解决方案2】:

    通常我发现pragma comment 风格的清单声明更无错误,从开发人员维护和整体构建操作的角度来看。 XML 清单是natoriously snafu

    对链接器的操作方式和 C 代码的常规编译非常熟悉,而且您只需将其加入到您的一个源文件中,这让一切都感觉更加“在一起”;

    #pragma comment(linker, \
        "\"/manifestdependency:type='Win32' "\
        "name='Microsoft.Windows.Common-Controls' "\
        "version='6.0.0.0' "\
        "processorArchitecture='*' "\
        "publicKeyToken='6595b64144ccf1df' "\
        "language='*'\"")
    

    【讨论】:

    • 哇,非常感谢,这是我从未想过要探索的途径。当我将这个库的下一个版本推送给 QA 时,我必须合并更改。
    【解决方案3】:

    我第一次在目标机器上部署 VS 2005 应用程序时遇到了类似的问题——必须引入 MSVCRT80 DLL。你是说那里已经有了 2008 VS 运行时库?

    ETA:另外,愚蠢的问题,但你确定你有 CRT 运行时(链接到上面) .NET 运行时,与你编译的相同版本(可能是 3.5)?您可能已经知道这一点(尤其是考虑到您的分数),但它们是两个不同的东西。

    【讨论】:

    • 是的,它让我觉得 redist 不起作用,但是将编译器 redist 中的文件夹复制到应用程序文件夹中工作正常。部署机器有 3.5,应用程序是 3.5,但库是针对 2.0(相同的 CLR)编译的。我确定我忽略了一些明显的东西。
    【解决方案4】:

    我找到了一个似乎可行的解决方案,虽然我不太喜欢它。

    我必须复制文件夹:

    Microsoft.VC90.CRT & Microsoft.VC90.MFC

    来自:Program Files\Microsoft Visual Studio 9.0\VC\redist\x86

    进入部署的应用程序目录,我只是不明白为什么这似乎有效,而可再发行组件什么也没做。

    编辑:查看清单我可能不需要复制 MFC 目录

    【讨论】:

      【解决方案5】:

      解决这个问题的最好方法是下载进程监视器,它是免费的: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

      添加一个过滤器以仅监视您的进程,它将向您显示该进程尝试的所有文件访问。这将准确地告诉你它找不到哪个 dll。

      当遇到同样的问题时,我总是使用它 - 如果只有 microsoft 在抛出的异常中填写文件名,那就更容易了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 2011-05-10
        • 2011-10-24
        • 2011-11-26
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多