【发布时间】:2023-03-09 12:20:01
【问题描述】:
我从事的 C# 项目有一个引用 stdole.dll 的程序集,在我的开发 PC 上位于 C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.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>..\..\..\hap\Build\packages\Microsoft.VisualStudio.Interop.17.0.0-previews-1-31314-256\lib\net472\Microsoft.VisualStudio.Interop.dll</HintPath>
</Reference>
<Reference Include="netstandard" />
<Reference Include="stdole, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\..\hap\Build\packages\stdole.17.0.0-previews-1-31314-256\lib\net472\stdole.dll</HintPath>
</Reference>
GAC 文件的版本为 7.0.9466.1,Nuget 包的版本为 17.0.31314.256。
我认为最好使用 Nuget 源并确保我们分发它的依赖项,而不是仅仅引用一些恰好在我的系统上的 DLL。 但我真的不明白它们之间有什么区别(如果有的话)。
stdole 包提供的链接都没有用。它们是:
-
来自 VS 中的 Nuget:https://aka.ms/vsextensibility(重定向到明显不相关且似乎没有提及 stdole 的“Visual Studio SDK”页面)
-
来自 Nuget website 的发行说明链接转到“Visual Studio 2015 Update 2 发行说明”,似乎也无关紧要
所以那些似乎是死胡同。
杂项/背景信息
该应用确实需要 stdole,因为它与一些旧版 VB6 代码交互,并且必须交换 StdPicture 对象。
之所以提出这个问题,是因为我的应用特别是在一台 PC 上出现了以下错误:
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.
此错误未在其他任何地方发生。因此,我担心我们遗漏了应该安装的依赖项,也许幸运的是大多数 PC 上都存在该依赖项,但不是全部。
【问题讨论】:
-
您确定您当前正在使用 GAC 中的版本吗?如果您将 COM 引用添加到 DLL(或 stdole32.tlb)而不是程序集引用,您将获得 COMReference XML。失败的机器是否安装了Office?它可以追溯到一段时间,但 iirc stdole.dll 仅随 Office 提供 - 您在 GAC 中拥有的版本可能是 Office PIA 程序集的一部分。
-
@AlexK。我正在研究 VS 在属性窗口中显示的 stdole 参考; Path 属性列出了 GAC 位置。您关于 Office PIA 的观点是有道理的,因为 Office 是非常普遍安装的;有错误的那台电脑没有它。