混合模式库和CRT依赖项-HELP
本文关键字:依赖 -HELP CRT 模式 混合 | 更新日期: 2023-09-27 17:48:52
好吧,在做了大量研究并尝试了我能找到的几乎所有托管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>
我可以根据需要提供更多的信息,不幸的是,我不擅长制作混合模式库,所以这让我很反感
如果有人能提供任何建议,我将不胜感激!
您在目标机器上部署CRT库了吗?远景:由于您依赖32位代码,因此应该在Build属性选项卡中将Target Platform设置为x86。
编辑:使用Sxstrace.exe实用程序并排解决问题的疑难解答,在Vista上可用。
通常,我发现从开发人员维护和全面构建操作的角度来看,pragma注释样式的清单分离更加无错误。XML清单极其混乱。
链接器的操作方式和C代码的常见编译,以及你只需将其放入一个源文件中的事实,让一切都感觉更"团结";
#pragma comment(linker, '
"'"/manifestdependency:type='Win32' "'
"name='Microsoft.Windows.Common-Controls' "'
"version='6.0.0.0' "'
"processorArchitecture='*' "'
"publicKeyToken='6595b64144ccf1df' "'
"language='*''"")
我第一次在目标机器上部署VS 2005应用程序时遇到了类似的问题——必须引入MSVCRT80 DLL。你是说你已经有了2008VS运行库吗?
ETA:还有一个愚蠢的问题,但你确定你有CRT Runtime(链接到上面)和.NET Runtime,它们的版本与你编译的版本相同(可能是3.5)吗?你可能已经知道了(尤其是考虑到你的分数),但它们是两件不同的事情。
我发现了一个似乎有效的解决方案,尽管我不太喜欢它。
我不得不复制文件夹:
Microsoft.VC90.CRT&Microsoft.VC90.MFC
发件人:Program Files''Microsoft Visual Studio 9.0''VC''redist''x86
在部署的应用程序目录中,我只是不明白为什么这似乎有效,而可再发行文件什么也没做。
编辑:查看清单,我可能不需要复制MFC目录
解决此问题的最佳方法是下载进程监视器,该监视器免费:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
添加一个仅监视进程的筛选器,它将显示进程尝试的所有文件访问。这将显示它找不到的确切dll。
当遇到同样的问题时,我总是使用这个——如果只有微软在抛出的异常中填写文件名,一切都会更容易。