Ответ 1
Кажется, что stdole.dll представляет собой сборку первичных взаимодействий. См. Предварительные сборки Interpase Office 2003 в MSDN.
У нас есть большое приложение С# (.net 2.0), которое использует наш собственный компонент С++ COM и стороннюю библиотеку сканеров отпечатков пальцев, также доступную через COM. Мы столкнулись с проблемой, когда на производстве некоторые события из библиотеки отпечатков пальцев не запускаются в приложение С#, хотя события из нашего собственного компонента С++ COM запускаются и получаются просто отлично.
Используя MSINFO32 для сравнения загруженных модулей в рабочей системе с системами, находящимися в неисправной системе, мы определили, что это было вызвано тем, что STDOLE.DLL не был в GAC и, следовательно, не загружен в неисправный процесс.
Перетаскивание этого файла в вызванные GAC события прекратилось из библиотеки COM отпечатков пальцев.
Так что делает stdole.dll? Он размером 16k, поэтому его не может быть много... это какая-то ссылка на другую библиотеку, такую как STDOLE32? Почему его отсутствие вызывает такое странное поведение?
Как мы распространяем stdole.dll? Это приложение для развертывания XCOPY, и мы не используем GAC. Должны ли мы упаковать его в качестве ресурса и использовать System.EnterpriseServices.Internal.Publish.GacInstall, чтобы обеспечить его в GAC?
Кажется, что stdole.dll представляет собой сборку первичных взаимодействий. См. Предварительные сборки Interpase Office 2003 в MSDN.
У меня была та же проблема. Я просто удалил ссылку из приложения и перекомпилировал. Пропустили все пройденные тесты. Затем перераспределялся без dll, и все это сработало.
Я не знаю, как ссылка на это попала в проект в первую очередь. Это устаревшее приложение, должно быть, было давно.
Саймон
Эта проблема также обсуждается здесь: Почему Visual Studio 2015 добавляет в проект проект stdole.dll и Microsoft.AnalysisServices.AdomdClient.dll?
Обновление старого проекта до VS 2015 - это то, что вызвало запуск stdole.dll в проект в этом случае.
Если ссылка на библиотеку имеет опцию "Вставить типы взаимодействия" в свойствах, это предпочтительнее, и после этого может не понадобиться stdole.dll. Просто установите Embed Interop Types=true
в свойствах ссылки.
Библиотеки, которые разрешают это, включают библиотеки MS Office, такие как Office, Excel, Core. Пример того, который не является Crystal Reports.
Hans Passant категорически не рекомендуется Embed Interop Types=false
здесь: В чем разница. Вставить Interop Типы true и false в Visual Studio?
Мне также пришлось добавить ссылку на мой проект для stdole. Несмотря на то, что у меня нет ссылок на него (это простое графическое приложение), у 2 наших пользователей появлялись ошибки, которые он отсутствовал. Может быть, они работают только с .net 2.0, когда это приложение 3.5. Я понял, почему.
Я также опубликовал на вкладке свойств проекта и выбранных файлов приложений, а затем включил развернутую stdole. Надеюсь, что это сработает.
В нашем проекте IDispatch couses используется stdole.dll. Мы изменили его на объект и удалили IDispatch, а затем удалили stdole из ссылок.