混合模式库和CRT依赖关系 - 帮助

时间:2008-10-23 17:49:39

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

好吧,经过大量的研究并尝试几乎每个托管的CPP Redist,我都可以找到并尝试将我的DLL本地复制到应用程序的执行目录中,我无法弄清楚我为此混合缺少哪些依赖项模式库。

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

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

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

  

异常细节:   System.IO.FileLoadException:不能   加载文件或程序集'USADSI.MAPI,   版本= 1.0.3174.25238,   Culture = neutral,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>

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

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

5 个答案:

答案 0 :(得分:4)

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

编辑:解决问题并排解决Sxstrace.exe utility的问题,可在Vista上找到。

答案 1 :(得分: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='*'\"")

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

我不得不复制文件夹:

Microsoft.VC90.CRT&amp; Microsoft.VC90.MFC

发件人:Program Files \ Microsoft Visual Studio 9.0 \ VC \ redist \ x86

在已部署的应用程序目录中,我无法弄清楚为什么这似乎有效并且可再发行组件没有做任何事情。

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

答案 4 :(得分:1)

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

添加过滤器以仅监视您的进程,它将显示进程尝试的所有文件访问权限。这将显示您无法找到哪个dll。

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