1

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

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

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

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

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

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

中间清单如下所示:

<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>

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

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

4

5 回答 5

4

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

编辑:使用 Vista 上提供的Sxstrace.exe 实用程序对问题进行并排解决问题。

于 2008-10-23T19:29:54.793 回答
2

通常,从开发人员维护和整体构建操作的角度来看,我发现pragma 注释样式清单 decleration 更加无错误。XML 清单非常混乱

对链接器的操作方式和 C 代码的常规编译的熟悉程度,以及您只需将其放入您的一个源文件这一事实,让一切都感觉更加“在一起”;

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='Microsoft.Windows.Common-Controls' "\
    "version='6.0.0.0' "\
    "processorArchitecture='*' "\
    "publicKeyToken='6595b64144ccf1df' "\
    "language='*'\"")
于 2009-06-02T07:50:16.627 回答
1

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

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

于 2008-10-23T20:38:38.477 回答
1

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

我不得不复制文件夹:

Microsoft.VC90.CRT & Microsoft.VC90.MFC

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

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

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

于 2008-10-23T20:42:58.360 回答
1

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

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

当遇到同样的问题时,我总是使用它——如果只有微软在抛出的异常中填写文件名,那一切都会更容易。

于 2008-11-03T23:39:14.977 回答