簡體   English   中英

GAC 中的 stdole.dll 與微軟的 Nuget package 有什么區別?

[英]What's the difference between stdole.dll in the GAC vs. Microsoft's Nuget package?

The C# project I work on has an assembly with a reference to stdole.dll which on my dev PC is located in C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll .

我不確定這個程序集最初是從哪里來的 I noticed that there is a Nuget package that provides it: https://www.nuget.org/packages/stdole/17.0.0-previews-1-31314-256 although we weren't using this.

我的程序集一直在使用預先存在的 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 package 的版本為17.0.31314.256

我認為最好使用 Nuget 源並確保我們分發它的依賴項,而不是僅僅引用一些恰好在我的系統上的 DLL。 但我真的不明白它們之間有什么區別(如果有的話)。


stdole package 提供的鏈接都沒有用。 他們是:

  • 從 VS 中的 Nuget 開始: https://aka.ms/vsextensibility (它重定向到明顯不相關的“Visual Studio SDK”頁面,似乎沒有提到 stdole)

  • 從 Nuget 網站發布說明鏈接轉到“Visual Studio 2015 Update 2 Release Notes”,似乎也無關緊要

所以這些似乎是死胡同。


雜項/背景信息

該應用程序確實需要stdole ,因為它與一些舊版 VB6 代碼接口,並且必須交換StdPicture object。

出現這個問題是因為我的應用程序在一台 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 中的內容與 Nuget package 中的內容之間沒有區別。 對於 stdole.dll 的各種版本,有stdole.dll包,可能與 GAC 中的包相同(這是我的經驗)。

當安裝 Office 或其他應用程序時,GAC DLL 可能已安裝在那里(如 Alex K. 的評論中所述)。 stdole.dll可用作主互操作程序集(PIA),如果它在 GAC 中,則似乎是 function。

但是,如果它不在 GAC 中,那么任何依賴它的應用程序都會失敗。 因此,我的建議是改用 Nuget package,並像部署任何其他依賴項一樣部署stdole.dll (除非您正在開發類似 Office 加載項的東西,基本上保證只有在存在 Office 依賴項時才會運行。)


上面的鏈接還提到了以下內容:

... 與所有 Office 2003 PIA 一樣,開發人員不應重新分發它們。

我將此解釋為您絕對不應該自己在 GAC 中安裝stdole.dll或任何其他 PIA。 我認為部署您自己的私有副本不會有害,如果您在未安裝 Office 的 PC 上運行,如果您無法嵌入互操作類型,您將別無選擇。

(我想您可以為OLE32.dll或其他任何東西創建自己的互操作程序集,但我認為沒有充分的理由這樣做,而不是使用微軟的stdole.dll ?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM