为什么Visual Studio 2015将stdole.dll和Microsoft.AnalysisServices.AdomdClient.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 我已经划掉了自

在早期版本的Visual Studio中,这些DLL不会添加到我的项目中。我的猜测是,我的一个引用依赖于这些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