好吧,经过大量的研究并尝试几乎每个托管的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>
我可以根据需要提供更多信息,但遗憾的是我并不精通制作混合模式库,所以这让我失望了。
如果有人可以提供任何建议,我将非常感激!
答案 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。
当遇到同样的问题时,我总是使用它 - 如果只有微软在抛出的异常中填充文件名,那将更容易。