我工作的C#项目有一个引用stdole.dll
的程序集,该程序集在我的开发PC上位于C:WINDOWSassemblyGACstdole7.0.3300.0__b03f5f7f11d50a3astdole.dll
中。
我不确定这个程序集最初是从哪里来的。我注意到有一个Nuget包提供了它:https://www.nuget.org/packages/stdole/17.0.0-previews-1-31314-256尽管我们没有用这个。
我的程序集一直在使用预先存在的GAC文件;当我从GAC stdole引用切换到Nuget版本时,从我的CSPROJ中删除了以下内容:
<COMReference Include="stdole">
<Guid>{00020430-0000-0000-C000-000000000046}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
取而代之的是:
<Reference Include="Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>......hapBuildpackagesMicrosoft.VisualStudio.Interop.17.0.0-previews-1-31314-256libnet472Microsoft.VisualStudio.Interop.dll</HintPath>
</Reference>
<Reference Include="netstandard" />
<Reference Include="stdole, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>......hapBuildpackagesstdole.17.0.0-previews-1-31314-256libnet472stdole.dll</HintPath>
</Reference>
GAC文件的版本为7.0.9466.1
,Nuget包的版本为17.0.31314.256
。
我认为最好使用Nuget源&确保我们分发它的依赖项,而不仅仅是引用碰巧在我的系统上的某个DLL但我真的不明白他们之间有什么区别(如果有的话(
stdole包提供的链接都没有用。它们是:
VS中的Nuget:https://aka.ms/vsextensibility(它重定向到一个"Visual Studio SDK"页面,该页面显然不相关,似乎更不用说stdole了(
从Nuget网站的Release Notes链接转到";Visual Studio 2015更新2发行说明";,同样看似无关紧要的
所以这些似乎都是死胡同。
杂项/背景信息
该应用程序确实需要stdole
,因为它与一些遗留的VB6代码接口,并且必须交换StdPicture
对象。
出现这个问题是因为我的应用程序在一台电脑上出现了以下错误,特别是:
Could not load file or assembly 'stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
此错误在其他任何地方都没有发生。正因为如此,我担心我们遗漏了一个应该安装的依赖项,也许幸运的是,大多数电脑上都存在这种依赖项,但不是所有电脑都存在。
底线似乎是本地GAC中的内容和Nuget包中的内容没有区别。有各种版本的stdole.dll
的Nuget包,可能与GAC中的相同(这是我的经验(。
GAC DLL可能是在安装Office或其他应用程序时安装在那里的(正如Alex K.的评论中所提到的(。stdole.dll
可以用作主互操作程序集(PIA(,如果它在GAC中,这似乎是它的功能。
但是,如果它不在GAC中,那么任何依赖它的应用程序都将失败。因此,我的建议是改用Nuget包,并像部署任何其他依赖项一样部署stdole.dll
。(除非你正在开发一个类似Office插件的东西,它基本上保证只有在存在Office依赖项时才能运行。(
上面的链接还提到了以下内容:
。。。与所有Office 2003 PIA一样,开发人员不应重新分发他们
我认为这意味着您绝对不应该自己在GAC中安装stdole.dll
或任何其他PIA。我不认为部署您自己的私有副本是有害的,如果您在没有安装Office的电脑上运行,如果您无法嵌入互操作类型,您将别无选择。
(我想你可以为OLE32.dll
或其他任何东西创建自己的互操作程序集,但我认为没有充分的理由这样做,而不是使用微软的stdole.dll
?(