2015-08-12 1 views
27

Diese DLLs wurden meinem Projekt in früheren Versionen von Visual Studio nicht hinzugefügt. Meine Vermutung ist, dass eine meiner Referenzen eine Abhängigkeit zu diesen DLLs hat. Von dem, was ich gelesen habe, könnte der markierte Microsoft.Office.Interop.Excel der eine sein. Kann das jemand bestätigen? Ich sollte auch beachten, dass VS 2015 diese DLLs immer veröffentlicht, auch wenn ich sie aus dem Projekt ausschließe. Wenn ich sie lösche, wird VS 2015 sie neu erstellen.Warum fügt Visual Studio 2015 stdole.dll und Microsoft.AnalysisServices.AdomdClient.dll meinem Projekt hinzu?

Bearbeiten: Ich habe bestätigt, dass die Excel-und Office-Referenzen sind, was die Einbeziehung von stdole.dll verursacht. Lesen Sie die ausgewählte Antwort unten, um stdole.dll zu entfernen.

Ich habe die benutzerdefinierten Referenzen durchgestrichen. Lassen Sie mich wissen, wenn mehr Informationen benötigt werden. Hier ist meine aktuellen Referenzen:

enter image description here

enter image description here

+5

Wie wäre es damit? Mein erster Downvote. Ein Downvote ohne Feedback ist sehr unproduktiv. –

+1

Ich bin an dieser Frage interessiert, weil stdole.dll auf allen Apps auftaucht, die ich mache. Ich veröffentliche mit Click-Once und es verursacht Fehler mit Visual Studio 2015. Es ist vielleicht nicht verwandt mit dieser Frage, aber andere Leute finden diese Frage möglicherweise nach dieser DLL suchen. Dieser andere Typ ersetzte es durch eine signierte Kopie in seinem: https://iznum.wordpress.com/2013/04/22/strong-name-signature-not-valid-for-this-assembly-stdole-dll/ – 249076

+1

Ein anderer Typ hat einen Fehler dazu gepostet: https://connect.microsoft.com/VisualStudio/feedback/details/1658072/could-not-load-assembly-file-stdole-dll-that-were-not-actually-using – 249076

Antwort

12

Wenn Sie die Möglichkeit haben, verwenden Sie einbetten Interop-Typen und lassen stdole.dll aus allem zusammen, oder Sie werden in das Problem laufen jedes Mal, wenn Sie bewegen die Anwendung (neue Server oder Dev-Maschinen), wo stdole.dll nicht signiert ist.

Problem: Es gibt einen Verweis, der stdole.dll erfordert, und stdole.dll wird jetzt automatisch in den Ordner bin verschoben.

Lösung:

  • Finden Sie die Referenz erfordern stdole.dll (mehr darüber, wie dies weiter unten tun)
  • gehen zu ihm Eigenschaften ist (rechte Maustaste> Eigenschaften)
  • Change „einbetten Interop-Typen "von falsch bis wahr.

Wie die Referenz zu finden: Wenn Sie auf die Eigenschaften Ihrer Referenzen klicken, überprüfen Sie, ob „Embed Interop-Typen“ auf false gesetzt ist, um zu sehen. Um noch weiter zu graben, hat Nick's answer einige gute Infos.

Referenzen ich bisher bestätigt haben, dass stdole.dll (wahrscheinlich mehr Office-Programme auch)

  • Büro

  • Excel

  • Kern

  • verwenden

    Crystal Reports (Danke Lithium. Wie Nick hervorhebt, darfst du nicht hav e der Vorteil Embed Interop Types=true der Einstellung)

Wenn Sie mehr finden, fügen Sie sie in den Kommentaren zu dieser Liste oder beachten sie, und ich werde es tun.

Hans Passantstark Einstellung Embed Interop Types=false schreckt hier: What's the difference setting Embed Interop Types true and false in Visual Studio?

Scott Hanselman spricht auch über das, was die "Embed Interop-Typen" tut sich hier: http://www.hanselman.com/blog/CLRAndDLRAndBCLOhMyWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx

+2

Hallo, danke für die Antwort. Sie können Crystal Reports-DLLs zur Liste der Referenzen hinzufügen, die stdole.dll – Lithium

2

In meiner Situation fand ich, dass Makeln die Copy Local Eigenschaft Die Assembly, die von stdole.dll abhängt, das Projekt speichern und dann die Eigenschaft auf den ursprünglichen Wert zurücksetzen und schließlich das Projekt speichern, löste das Problem. Diese Eigenschaft steht möglicherweise auch mit der Eigenschaft "Interoparten einbetten" für andere Personen mit diesem Problem in Zusammenhang.

In diesem Fall wird die Eigenschaft Copy Local explizit in die Datei .xxproj gespeichert. Andernfalls befindet sich der Status dieser Eigenschaft nicht in der Projektdatei und es wird ein Standardwert angenommen. Ich habe keine Erklärung, warum dies funktioniert, da das Vorhandensein der Eigenschaft in der Projektdatei weder den angezeigten Wert in Visual Studio ändert, noch eine Änderung in der tatsächlich veröffentlichten Baugruppe verursacht. Ich habe auch keine Änderung dieser Eigenschaften von ihren ursprünglich angezeigten Werten verursacht, nachdem ich sie hin und her geschaltet habe.

Ich bemerke, dass, noch bevor ich die Heilung gefunden habe sah ich, dass die Reinigung des Projekts und der Wiederaufbau es nicht stdole.dll in bin zu kopieren verursacht. Erst nach der Veröffentlichung erschien stdole.dll.

+0

Good info verwenden. Nun frage ich mich, ob ich einen Verweis entfernt habe, der auf 'Copy Local' gesetzt wurde und der Verweis, den ich erneut hinzugefügt habe, nicht war. –

+0

Ihr Instinkt war korrekt bei "Interop-Typen einbetten". Ich habe das Problem gefunden und meine Antwort aktualisiert. –

8

Ich habe mit diesem Problem seit Ewigkeiten beschäftigt.

Immer wenn ich etwas von der Webplattform oder irgendwelche Updates installiere, wird die stdole.dll durch eine nicht signierte Version ersetzt. Ich habe den Fehler vor einiger Zeit bei Microsoft gemeldet, bin aber auf taube Ohren gestoßen.

Ich gehe zu C: \ Programme (x86) \ Microsoft.NET \ Primary Interop Assemblys und kopieren Sie die signierte Version (22kb) von hier und ersetzen Sie die Version in C: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ Visual Studio Tools für Office \ PIA \ Common (16 KB) und das löst das Problem.

Scott

+0

Scott, ich habe einen Weg gefunden, dies zu tun, ohne mit der stdole.dll herumzuspielen. Habe gerade meine Antwort aktualisiert. Ich habe dich immer noch gewählt, weil du mir einen weiteren Workaround gegeben hast. –

18

Wie andere schon angedeutet, stdole.dll ist eine primäre Interop-Assembly für eine Reihe von Office-COM-Interop-Komponenten. Sie können feststellen, warum es in Ihrem Projekt enthalten ist, indem Sie folgendermaßen vorgehen. In Visual Studio gehen Sie zu Tools > Options > Projects and Solutions > Build and Run. Ändern Sie die Einstellung "MSBuild-Projekt Build-Ausgabe Ausführlichkeit" auf Detailed. Reinigen Sie Ihr Projekt und erstellen Sie es neu.

Öffnen Sie das Ausgabefenster und suchen Sie nach stdole. Sie sollten einen Abschnitt wie diese finden:

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". 

Sie sehen können, wo Visual Studio für die Montage als auch gesucht, was es am Boden erfordert. In meinem Fall handelt es sich um eine Reihe alter Crystal Reports-Assemblies.

Manchmal können Sie die Interop-Typen über die Abhängigkeiten einbetten, wie Tony es empfiehlt, aber nicht immer. Für mich unterstützen die Crystal Reports-Assemblies das nicht.

Ich habe dieses Problem (und die heimtückische scottsanpedro erwähnt) durch Kopieren der stdole.dll (32KB, digital signiert) von C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\ in einen Ordner "Abhängigkeiten" in meinem Projekt. Ich habe die Datei zu meinem Projekt hinzugefügt und einen expliziten Verweis hinzugefügt (Verweis hinzufügen> Durchsuchen).Schließlich habe ich die Eigenschaften der neuen Referenz geöffnet und Embed Interop Types auf True gesetzt.

Dies scheint eine bessere Situation zu sein. Ich sollte nicht befürchten müssen, eine unsignierte Version der Assembly zu bekommen.

+0

Gute Infos, Nick. Ich werde mich auf Ihre Antwort in meiner Antwort beziehen, um herauszufinden, welche Klassen sich auf die DLL beziehen. –

+0

Wenn Sie "Interop-Typen einbetten" auf "True" setzen, muss stdole.dll noch benötigt werden? Meine App benötigt es nicht mehr. –