我工作的C#项目有一个程序集,其中引用了stdole.dll,它位于我的dev 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包提供的链接没有一个是有用的。它们是:
看来那些都是死胡同。
Misc /背景信息
该应用程序确实需要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.此错误未发生在其他任何地方。正因为如此,我担心我们遗漏了一个应该安装的依赖项,也许幸运地存在于大多数个人电脑上,但不是全部。
发布于 2021-06-28 16:45:22
底线似乎是,什么可能是在当地的GAC和什么是在Nuget包是没有区别的。有各种版本的stdole.dll的Nuget包,大概也是GAC中的相同版本(这是我的经验)。
GAC DLL可能安装在那里(正如Alex .的评论中提到的那样)。安装Office或其他应用程序时。可用作主互操作程序集。 (PIA),如果它在GAC,那似乎是它的功能。
但是,如果它不在GAC中,那么任何依赖它的应用程序都会失败。因此,我的建议是改用Nuget包,并像部署任何其他依赖项一样部署stdole.dll。(除非您正在开发类似于Office外接程序的东西-其中基本上保证只有在Office依赖项出现时才能运行。)
上面的链接还提到了以下内容:
..。与所有Office 2003 PIA一样,开发人员不应该重新分发它们。
我认为这意味着您绝对不应该自己在GAC中安装stdole.dll或任何其他PIA。我不认为部署您自己的私人副本将是有害的,如果您运行在没有安装Office的个人电脑上,您将别无选择,如果您不能嵌入互操作类型。
(我想您可以为OLE32.dll或其他任何东西创建您自己的互操作程序集,但我不认为有什么好的理由来代替使用微软的stdole.dll?)
https://stackoverflow.com/questions/67695533
复制相似问题