如何解决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。 但我真的不明白它们之间有什么区别(如果有的话)。
-
来自 VS 中的 Nuget:https://aka.ms/vsextensibility(重定向到“Visual Studio SDK”页面,该页面显然不相关且似乎没有提及 stdole)
-
来自 Nuget website 的发行说明链接指向“Visual Studio 2015 Update 2 发行说明”,也看似无关
所以这些似乎是死胡同。
其他/背景信息
该应用确实需要 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 举报,一经查实,本站将立刻删除。