GAC 中的 stdole.dll 与 Microsoft 的 Nuget 包有什么区别?

如何解决GAC 中的 stdole.dll 与 Microsoft 的 Nuget 包有什么区别?

我从事的 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,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 包提供的链接都没有用。它们是:

所以这些似乎是死胡同。


其他/背景信息

该应用确实需要 stdole,因为它与一些旧的 VB6 代码交互,并且必须交换 StdPicture 对象。

出现这个问题是因为我的应用在一台 PC 上出现了以下错误

Could not load file or assembly 'stdole,Version=7.0.3300.0,PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

错误在其他任何地方均未发生。正因为如此,我担心我们会遗漏一个应该安装的依赖项,也许幸运的是,大多数 PC 上都存在某些东西,但不是全部。

解决方法

底线似乎是本地 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。我认为部署自己的私有副本不会有害,如果您在未安装 Office 的 PC 上运行,如果您无法embed interop types .

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?