Почему Visual Studio 2015 добавляет в проект проект stdole.dll и Microsoft.AnalysisServices.AdomdClient.dll?
Эти библиотеки DLL не добавляются в мой проект в предыдущих версиях Visual Studio. Я предполагаю, что одна из моих ссылок имеет зависимость от этих DLL. Из того, что я прочитал, выделенный Microsoft.Office.Interop.Excel
может быть тем. Может ли кто-нибудь подтвердить это? Следует также отметить, что VS 2015 всегда публикует эти DLL, даже если я исключаю их из проекта. Если я их удалю, VS 2015 переделает их.
Изменить. Я подтвердил, что ссылки Excel и Office являются причиной включения stdole.dll. См. Выбранный ответ ниже, чтобы удалить файл stdole.dll.
Я перечеркнула пользовательские ссылки. Дайте мне знать, нужна ли дополнительная информация. Здесь мои текущие ссылки:
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Ответы
Ответ 1
Если у вас есть этот параметр, используйте Embed Interop Types и оставите файл stdole.dll из него все вместе или вы столкнетесь с проблемой при каждом перемещении приложения (новые серверы или dev-машины), где stdole.dll не является подписан.
Проблема: Существует ссылка, которая требует, чтобы stdole.dll и stdole.dll теперь автоматически помещались в папку bin.
Решение:
- Найдите ссылку, требующую stdole.dll(подробнее о том, как это сделать ниже)
- Перейдите к свойствам (щелкните правой кнопкой мыши- > свойства)
- Измените "Вставить типы взаимодействия" с false на true.
Как найти ссылку:. Когда вы нажимаете на свойства своих ссылок, проверьте, установлено ли значение "Вставить типы прерываний" в значение "false". Чтобы копать еще больше, Ник ответ имеет отличную информацию.
Ссылки, которые я подтвердил до сих пор, которые используют stdole.dll (возможно, больше офисных программ)
Если вы найдете больше, добавьте их в этот список или заметьте в комментариях, и я сделаю это.
Hans Passant категорически не рекомендуется Embed Interop Types=false
здесь: В чем разница. Вставить Interop Типы true и false в Visual Studio?
Скотт Гензельман также рассказывает о том, что здесь делает "Вставить типы взаимодействия": http://www.hanselman.com/blog/CLRAndDLRAndBCLOhMyWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx
Ответ 2
Как указывалось другими словами, stdole.dll
- это первичная сборка Interop для группы компонентов COM-взаимодействия 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".
Вы можете увидеть, где Visual Studio искала сборку, а также то, что требует ее внизу. В моем случае это куча старых сборок Crystal Reports.
Иногда вы можете встраивать типы interop через зависимости, как предлагает Тони, но не всегда. Для меня сборки Crystal Reports не поддерживают это.
Я исправил эту проблему (и упоминал коварный один scottsanpedro), скопировав stdole.dll
(32 КБ, с цифровой подписью) из C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\
в папку "Зависимости" внутри моего проекта. Я добавил файл в свой проект и добавил явную ссылку на него (Добавить ссылку > Обзор). Наконец, я открыл новые ссылочные свойства и установил Embed Interop Types
в True
.
Кажется, это лучшая ситуация. Мне не нужно беспокоиться о получении неподписанной версии сборки.
Ответ 3
Я занимаюсь этой проблемой целую вечность.
Всякий раз, когда я устанавливаю что-либо с веб-платформы или любых обновлений, stdole.dll заменяется не подписанной версией. Я сообщил об ошибке в Microsoft некоторое время назад, но упал на глухие уши.
Я перехожу к C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies и копирую подписанную версию (22kb) отсюда и заменяю версию в C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Common (16kb), и это решает проблему.
Скотт
Ответ 4
В моей ситуации я обнаружил, что переключает свойство Copy Local сборки, которое зависит от stdole.dll, сохраняя проект, а затем переключая свойство обратно на его исходное значение, и, наконец, сохранение проекта снова решило проблему. Это свойство также может быть связано с свойством Embed Interop Types для других людей с этой проблемой.
Что это делает, явным образом сохраняет свойство Copy Local в файле .xxproj. В противном случае состояние этого свойства отсутствует в файле проекта и предполагается значение по умолчанию. У меня нет объяснений, почему это работает, поскольку наличие свойства в файле проекта не изменяет отображаемое значение в Visual Studio и не вызывает изменения в сборке, которая фактически публикуется или нет. Я также не вызывал изменения этих свойств из их первоначально отображаемых значений после переключения их туда и обратно.
Я замечаю, что еще до того, как я нашел лекарство, я увидел, что очистка проекта и его восстановление не привели к тому, что stdole.dll будет скопирован в корзину. Только после публикации появилось stdole.dll.