【问题标题】:What's the difference between stdole.dll in the GAC vs. Microsoft's Nuget package?GAC 中的 stdole.dll 与 Microsoft 的 Nuget 包有什么区别?
【发布时间】: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 是非常普遍安装的;有错误的那台电脑没有它。

标签: .net vb6 nuget gac stdole


【解决方案1】:

底线似乎是本地 GAC 中的内容与 Nuget 包中的内容没有区别。 stdole.dll 的各种版本都有 Nuget 包,大概与 GAC 中的相同(这是我的经验)。

安装 Office 或其他应用程序时,GAC DLL 可能已安装在那里(正如 Alex K. 的评论中所述)。 stdole.dll can be used as a Primary Interop Assembly (PIA),如果它在 GAC 中,那似乎就是它的功能。

但是,如果它不在 GAC 中,那么任何依赖它的应用程序都会失败。因此,我的建议是改用 Nuget 包,并像部署任何其他依赖项一样部署 stdole.dll。 (除非您正在开发类似 Office 加载项之类的东西,基本上保证仅在存在 Office 依赖项时才会运行。)


上面的link还提到了以下内容:

...与所有 Office 2003 PIA 一样,开发人员不应重新分发 他们。

我将此解释为您绝对不应在 GAC 中安装stdole.dll 或任何其他 PIA。我不认为部署您自己的private 副本会有害,如果您在没有安装 Office 的 PC 上运行,如果您无法embed interop types,您将别无选择。

(我想你可以为OLE32.dll 或其他任何东西创建自己的互操作程序集,但我认为没有充分的理由这样做而不是使用微软的stdole.dll?)

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多