为什么Visual Studio 2015将stdole.dll和Microsoft.AnalysisServices.AdomdClient.dll添加到我的项目中?
在早期版本的Visual Studio中,这些DLL不会添加到我的项目中。我的猜测是,我的一个引用依赖于这些DLL。据我所知,突出显示的为什么Visual Studio 2015将stdole.dll和Microsoft.AnalysisServices.AdomdClient.dll添加到我的项目中?,dll,reference,visual-studio-2015,Dll,Reference,Visual Studio 2015,在早期版本的Visual Studio中,这些DLL不会添加到我的项目中。我的猜测是,我的一个引用依赖于这些DLL。据我所知,突出显示的Microsoft.Office.Interop.Excel可能就是其中之一。有人能证实这一点吗?我还应该注意到,VS 2015也总是发布这些DLL,即使我将它们从项目中排除。如果我删除它们,VS 2015将重新制作它们 编辑:我已确认Excel和Office引用是导致包含stdole.dll的原因。请参阅下面的选定答案以删除stdole.dll 我已经划掉了自
Microsoft.Office.Interop.Excel可能就是其中之一。有人能证实这一点吗?我还应该注意到,VS 2015也总是发布这些DLL,即使我将它们从项目中排除。如果我删除它们,VS 2015将重新制作它们
编辑:我已确认Excel和Office引用是导致包含stdole.dll的原因。请参阅下面的选定答案以删除stdole.dll
我已经划掉了自定义参考资料。如果需要更多信息,请告诉我。以下是我目前的参考资料:
如果您有选择权,请使用嵌入互操作类型并将stdole.dll全部删除,否则每次将应用程序(新服务器或开发人员计算机)移动到stdole.dll未签名的位置时,都会遇到问题
问题:有一个引用需要stdole.dll,stdole.dll现在自动推送到bin文件夹
解决方案:
- 查找需要stdole.dll的参考文件(下面详细介绍如何执行此操作)
- 转到其属性(右键单击->属性)
- 将“嵌入互操作类型”从false更改为true
如何查找引用:单击引用的属性时,检查“嵌入互操作类型”是否设置为false。为了进一步挖掘,我有一些很好的信息
到目前为止,我已经确认使用stdole.dll的引用文件(可能还有更多的office程序)
- 办公室
- 胜过
- 核心
- Crystal Reports(谢谢你。正如Nick指出的,你可能没有设置
Embed Interop Types=true
的优势)
- 网络办公室
如果你发现更多,请将它们添加到此列表或在评论中记下,我会这样做
强烈反对在此处设置嵌入互操作类型=false
:
Scott Hanselman还谈到了“嵌入互操作类型”在这里的作用:在我的情况下,我发现切换依赖于stdole.dll的程序集的Copy-Local属性,保存项目,然后将属性切换回其原始值,最后再次保存项目解决了问题。此属性也可能与其他有此问题的人的“嵌入互操作类型”属性相关
这样做的目的是将“复制本地”属性显式保存到.xxproj文件中。否则,此属性的状态不在项目文件中,并假定为默认状态。我没有解释为什么这样做,因为项目文件中的属性不会更改Visual Studio中显示的值,也不会导致实际发布或未发布的程序集发生更改。在来回切换这些属性后,我也没有使它们的原始显示值发生变化
我确实注意到,甚至在找到解决方法之前,我就看到清理项目并重建它并没有导致stdole.dll被复制到bin。只有在发布之后,stdole.dll才出现。我处理这个问题已经很久了
每当我从web平台安装任何东西或任何更新时,stdole.dll都会被替换为非签名版本。不久前,我向微软报告了这个漏洞,但置若罔闻
我转到C:\Program Files(x86)\Microsoft.NET\Primary Interop程序集,从这里复制签名版本(22kb),并替换C:\Program Files(x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Common(16kb)中的版本,这就解决了问题
Scott正如其他人所指出的,stdole.dll
是一组Office COM互操作组件的主要互操作程序集。您可以通过执行以下操作来确定为什么要将其包含在项目中
在Visual Studio中,转到Tools>Options>Projects and Solutions>Build and Run
。将“MSBuild项目生成输出详细信息”设置更改为Detailed
。现在清理并重建您的项目
打开输出窗口并搜索stdole
。您应该找到这样一个部分:
25> Dependency "stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
25> Resolved file path is "D:\Program Files (x86)\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Common\stdole.dll".
25> Reference found at search path location "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}".
25> For SearchPath "D:\Git\FoobarServices\Dependencies\Dependencies".
25> Considered "D:\Git\FoobarServices\Dependencies\stdole.winmd", but it didn't exist.
25> Considered "D:\Git\FoobarServices\Dependencies\stdole.dll", but it didn't exist.
25> Considered "D:\Git\FoobarServices\Dependencies\stdole.exe", but it didn't exist.
25> For SearchPath "{CandidateAssemblyFiles}".
25> Considered "Dependencies\CrystalDecisions.CrystalReports.Engine.dll", but its name "CrystalDecisions.CrystalReports.Engine" didn't match.
25> Considered "Dependencies\CrystalDecisions.Enterprise.Framework.dll", but its name "CrystalDecisions.Enterprise.Framework" didn't match.
25> Considered "Dependencies\CrystalDecisions.Enterprise.InfoStore.dll", but its name "CrystalDecisions.Enterprise.InfoStore" didn't match.
25> Considered "Dependencies\CrystalDecisions.ReportSource.dll", but its name "CrystalDecisions.ReportSource" didn't match.
25> Considered "Dependencies\CrystalDecisions.Shared.dll", but its name "CrystalDecisions.Shared" didn't match.
25> Considered "Dependencies\CrystalDecisions.Web.dll", but its name "CrystalDecisions.Web" didn't match.
25> For SearchPath "{TargetFrameworkDirectory}".
25> Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\stdole.winmd", but it didn't exist.
25> Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\stdole.dll", but it didn't exist.
25> Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\stdole.exe", but it didn't exist.
25> For SearchPath "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}".
25> Considered AssemblyFoldersEx locations.
25> Required by "CrystalDecisions.Web, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, processorArchitecture=MSIL".
25> Required by "CrystalDecisions.ReportSource, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, processorArchitecture=MSIL".
25> Required by "CrystalDecisions.CrystalReports.Engine, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, processorArchitecture=MSIL".
25> Required by "CrystalDecisions.Enterprise.InfoStore, Version=11.5.3300.0, Culture=neutral, PublicKeyToken=692fbea5521e1304".
25> The ImageRuntimeVersion for this reference is "v1.0.3705".
您可以在底部看到VisualStudio在哪里搜索程序集以及需要它的内容。在我的例子中,这是一堆旧的Crystal Reports程序集
有时候,正如Tony所建议的,您可以通过依赖项嵌入互操作类型,但并不总是这样。对我来说,Crystal Reports程序集不支持这一点
我通过将C:\Program Files(x86)\Microsoft.NET\Primary Interop Assembly\
中的stdole.dll
(32KB,数字签名)复制到项目中的“Dependencies”文件夹中,修复了这个问题(以及scottsanpedro提到的隐蔽问题)。我将该文件添加到我的项目中,并添加了对它的显式引用(添加引用>浏览)。最后,我打开了新引用的属性,并将Embed Interop Types
设置为True
这似乎是一个更好的情况。我不必担心程序集的未签名版本。怎么样?我第一次投反对票。没有反馈的否决票是非常低效的。我对这个问题感兴趣,因为stdole.dll正在我所做的所有应用程序中弹出。我使用click once发布,这会导致visual studio 2015出现故障。它可能与此问题无关,但其他人可能会在搜索该dll时发现此问题。另一个家伙在他的文章中用一个签名副本替换了它:另一个家伙发布了一个错误:@249076我猜你的应用程序有“嵌入互操作类型”=false的引用,可能现在在一个u