在哪里可以找到一些官方说明,kb文章或其他描述Visual Studio 2010 C/C++运行时链接和部署策略更改的文档?
在Visual Studio 2008(使用VC90运行时)下,清单嵌入在本机映像中,运行时库部署为并行程序集(WinSxS).使用VS 2008 SP1重建本机exe或库时,这会导致问题,因为嵌入式清单需要更新版本的C++运行时.
对于VS 2010和MSVCR100运行时版本,策略似乎已完全更改.
这似乎是政策的一个重大变化,从SxS部署的回溯和我们在VS 2008下的清单依赖性.任何人都可以更好地了解变化的内容,并且可能指向一些文档,描述这些变化的自述文件或博客文章,动机和相关影响?
它认为这种方式更好 - 强大的版本清单和SxS部署是一场噩梦 - 但我对VS 2010中这些意外且看似无证的变化感到惊讶.
额外问题:如何在VS 2010下编译我的C++/CLI库以链接到msvcr100_clr0400.dll而不是msvcr100.dll?这个想法是C++/CLI程序集应该运行时没有.NET 4安装的依赖项(没有静态链接).
我正在研究一个免费的私有注册WinSxS的配置,它提供了简单的程序集清单文件,在部署和运行时将Delphi可执行文件(COM客户端)和.NET(C#)COM可见DLL组合在一起.
我已经研究了MSDN "与非托管代码互操作"中提供的文档,特别是关于" COM Callable Wrapper "和" 如何:为无注册激活配置基于.NET Framework的COM组件 "的部分.
经过一个多星期的研究并在文件不足的情况下(重新)指导,我决定在这里提出我的第一个问题.
计划的部署结构如下所示:
./install-root
????ProgramSuite1
? ????bin
? ? DelphiNativeCOMClient1.exe
? ? DelphiNativeCOMClient1.exe.config
? ? DelphiNativeCOMClient2.exe
? ? DelphiNativeCOMClient2.exe.config
? | ...
? ?
? ????data
? ...
????ProgramSuite2
? ????bin
? ? DelphiNativeCOMClient3.exe
? ? DelphiNativeCOMClient3.exe.config
? ? DelphiNativeCOMClient4.exe
? ? DelphiNativeCOMClient4.exe.config
? | ...
? ?
? ????data
? ...
????SharedLibs
????MyCompany.Libs.Set1
? MyCompany.Libs.Set1.manifest
? SomeManagedCOMServerA.dll
? SomeNativeCOMServerB.dll
? SomeNativeCOMServerC.dll
?
????MyCompany.Libs.Set2
MyCompany.Libs.Set2.manifest
SomeManagedCOMServerB.dll …Run Code Online (Sandbox Code Playgroud) 我有Visual C++ 2008的问题.我已经安装了opencv,我已经创建了一个新程序,我构建它没有错误.但是,它抱怨在调试时没有找到MSVCR90D.dll.在发布模式下,完全没有问题.
我在其中一个Winsxs文件夹中有MSVCR90D.dll.有谁知道这个问题的解决方案?这是一个已知的错误?
杰拉德
我正在一个受到严重限制的环境中开发,但开发人员也可以严格控制.
VCRedist_x86.exe - 一个4Mb可再发行 - 没什么好玩的(传输4个小时).我真的更喜欢重新分发MFC90.dll,msvcm90.dll,msvcp90.dll和msvcr90.dll - 这更像是2Mb.但是,重新分发Visual C++文件说:
不支持重新分发在没有清单的情况下构建的C/C++应用程序.如果没有清单将应用程序绑定到这些库,则C/C++应用程序无法使用Visual C++库.有关更多信息,请参阅选择部署方法.
我最初将DLL复制到程序工作目录中的计划似乎不适用于这个勇敢的新的清单世界.
我的下一个猜测是提取填充文件到WinSxS目录所需的注册表项并自己填充(而不是使用4兆程序).
[edit]软件经常更新,因此DLL比静态链接更受欢迎.[/编辑]
如何成功分发必要的文件但保持开销?
经过大量的试验和错误(主要是由于缺少文档和示例),我设法创建了MSI安装程序,将自定义DLL作为并行程序集安装到WinSxS.只有一个问题:卸载会将所有文件(DLL,清单和目录)保留在WinSxS目录中.怎么能或者我应该最好地清理它?我确信没有别的东西可以引用它.
我已经读过某个地方,WinSxS有一个自我清理过程,随着时间的推移清理,但我无法找到更多相关信息.你可以手动调用它来清理东西吗?
我看到的唯一另一种方法是手动删除这些位.首先,您必须将所有文件(程序集,目录,清单及其各自的目录)的所有者从SYSTEM更改为管理员帐户,调整权限并将其删除.注册表中还有一些部分(我认为HKLM\COMPONENTS\DerivedData\Components可能是一个地方),但由于WinSxS应该被视为不透明,因此很难找到任何信息.
我无法运行调试sdk应用程序,因为它需要CRT的VC 8和VC 9版本.但它只需要visual studio 2008 for plugin dev,这就是我所需要的.
如何将调试运行时从2005年安装到Windows7计算机上?我无法弄清楚如何使它们运行应用程序本地,也无法在没有可信安装程序的情况下将任何内容复制到winSxS文件夹中.
我有几个VC++ DLL的问题,我应该将其包含在我的.NET/C#项目中.一个VC++ DLL是一个C++/CLI DLL,我将其用作.NET项目的公共接口.其他DLL是用本机C++编写的.我无法访问VC++ DLL的源代码,我只需要使用它们.
我做了一个.NET测试项目并引用了C++/CLI DLL.没问题,编译器很幸运,很棒.只有一个问题:当我启动.NET程序的EXE时,由于缺少VC++核心DLL,我得到有关C++ DLL的错误.sxstrace显示以下内容(缩写):
INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
INFO: Reference: Microsoft.VC80.OpenMP,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
...
ERROR: Cannot resolve reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195".
Run Code Online (Sandbox Code Playgroud)
现在我不是傻瓜,尝试了几件事.我已经阅读了很多关于WinSxS的内容,以便更深入地了解正在发生的事情.现在,我已经到了,我正在为我服务.我想要执行程序的系统安装了当前版本8.0.50727.762(SP1)中的VC++ Redistributable软件包.我知道winsxs中有一个针对Microsoft.VC80.CRT的策略文件,它将此程序集的所有版本重定向到当前版本8.0.50727.762(这是http://blogs.msdn.com/b/nikolad上的问题的解决方案/archive/2007/03/29/a-solution-to-two-references-to-different-versions-of-crt-mfc-atl-in-one-application-manifest-file.aspx).但正如上面的错误所说,此策略文件似乎不起作用或不予考虑.系统只想找到8.0.50727.6195版本的程序集.
现在这是第一个问题:这里的问题是什么?我搞清楚后,我可以解决最初的问题......
我有一个我在Delphi XE中构建的组件,我希望以下列方式使用它:
用户创建一个新的空白项目.
用户在表单上删除我的组件.
我的组件中会执行一些特殊的Designtime代码,这将更改项目选项以取消选中项目选项中的"启用运行时主题"复选框.我不确定这是否可能,所以我问是否可能.
如果#3不可能,那么我需要用这个组件解决我的"可用性"问题; 我遇到的问题是,如果用户不通过取消选中启用运行时主题来禁用静态链接的清单文件,那么链接到EXE的静态生成的清单似乎会覆盖我想要在EXE之外的外部清单文件,磁盘.我还需要在运行时修改这些清单,因此需要外部清单.当然,我可以在需要时使用这些清单启用运行时主题功能.第二个问题是关于外部和内部清单的优先级; 当您选中"启用运行时主题"时,外部清单能否以某种方式优先于链接到Delphi应用程序的内部清单资源?
除#3以外的可接受的解决方案:
A.不知何故导致Delphi无法生成清单.B.不知何故,在运行时,Windows会识别外部.manifest文件并确定其优先级,即使找到内部文件也是如此.
C.最不好的解决方案; 在运行时,在我的组件中的CoCreateInstance失败之后,我可以枚举资源,报告外部清单存在并且弄乱我们,并依赖于使用我的组件的开发人员读取我的组件吐出的运行时错误消息,告诉他们禁用运行时主题复选框并重建他们的应用程序 提取和读取清单已在此处的另一个stackoverflow问题中介绍,其中C++代码可以轻松转换为Delphi.
更新接受的答案完全符合我的要求,但被认为是黑客攻击,大卫关于激活上下文的答案更加明智,是推荐的方法.
Update2内置清单通常在更高版本的Delphi(XE5及更高版本)中通过项目设置明确指定要链接的清单来覆盖.
升级到最新版本的TortoiseSVN(1.5.2.13595)后,它的上下文菜单不再可用.
尝试手动运行时,我收到此错误:
The application has failed to start because its side-by-side configuration is incorrect.
Please see the application event log for more detail
Run Code Online (Sandbox Code Playgroud)
应用程序日志显示了这一点
Activation context generation failed for "C:\Program Files\TortoiseSVN\bin\TortoiseSVN.dll".
Dependent Assembly Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.30411.0" could not be found.
Please use sxstrace.exe for detailed diagnosis.
Run Code Online (Sandbox Code Playgroud) winsxs ×10
.net ×3
c++ ×2
com ×2
delphi ×2
visual-c++ ×2
assemblies ×1
c# ×1
c++-cli ×1
crt ×1
debugging ×1
dependencies ×1
dll ×1
manifest ×1
msvcr100.dll ×1
msvcr90d.dll ×1
ota ×1
regfreecom ×1
sxs ×1
toolsapi ×1
tortoisesvn ×1
uninstall ×1
wix ×1