为什么带有嵌入式 Adob​​e Reader 控件的应用在从 VS 2013 而不是 VS 2017 发布时工作?

Why does app with embedded Adobe Reader Control work when published from VS 2013 but not VS 2017?

我的应用程序使用 "Adobe PDF Reader" 控件查看 Windows 表单上的 PDF 文档。它作为 ClickOnce 应用程序发布。如果我使用 Visual Studio 2013 发布它,它会安装并且 运行 没问题。但是,如果我使用 Visual Studio 2017 发布它(不对解决方案进行任何更改),它将安装但不会安装 运行。它抛出这个错误: System.IO.FileNotFoundException: 无法加载文件或程序集 'AxInterop.AcroPDFLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=963d585c671a3ae6' 或其依赖项之一。系统找不到指定的文件。

所以我去了Visual Studio中的"Publish/Application Files..."来包含丢失的dll,却发现我无法包含它,因为它没有被列出。

在 VS 2017 中,"Application Files" window 如下所示:

但在 VS 2013 中 "Application Files" window 看起来像这样:

现在,在 VS 2013 中,ClickOnce 文件夹中发布的 MANIFEST 文件包含此 XML:

<dependency>
    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AxInterop.AcroPDFLib.dll" size="9216">
      <assemblyIdentity name="AxInterop.AcroPDFLib" version="1.0.0.0" language="neutral" processorArchitecture="msil" />
      <hash>
        <dsig:Transforms>
          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
        </dsig:Transforms>
        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <dsig:DigestValue>Nyyy1D0D9ublZaujf9VDo73k2Ic=</dsig:DigestValue>
      </hash>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Interop.AcroPDFLib.dll" size="12800">
      <assemblyIdentity name="Interop.AcroPDFLib" version="1.0.0.0" language="neutral" processorArchitecture="x86" />
      <hash>
        <dsig:Transforms>
          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
        </dsig:Transforms>
        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <dsig:DigestValue>ECgRqgvCeIc6FfkrboUllt0qScw=</dsig:DigestValue>
      </hash>
    </dependentAssembly>
  </dependency>

但是使用 VS 2017 发布时,MANIFEST 文件中缺少上述 XML。

再次提醒,请记住这是完全相同的项目和解决方案。我什么都没改变。

我需要做什么才能让 VS 2017 发布版本包含所需的依赖信息?这是一个错误,还是我遗漏了什么?

谢谢!

经过几天的调查和反复试验,我发现了一个简单的解决方法来解决我的问题:

  1. 在 VS 2017 中,对 Debug 和 Release 版本执行 "Build/Batch Build"。注意:这样做时,VS 会将必要的文件 "AxInterop.AcroPDFLib.dll" 和 "Interop.AcroPDFLib.dll" 放入 Bin\Release 文件夹中。
  2. 现在添加引用(使用浏览选项)以添加对 Bin\Release 文件夹中的 "AxInterop.AcroPDFLib.dll" 和 "Interop.AcroPDFLib.dll" 文件的引用。
  3. 在解决方案 Explorer/References 中,右键单击菜单上的 Interop.AcroPDFLib.dll 和 select 属性。然后在属性 window 中将 "Embed Interop Types" 更改为 False。
  4. 现在转到项目 Properties/Publish/Application 文件并将这两个 dll 的发布状态设置为 "Include"(而不是 "Include (Auto)")。

然后我使用 VS 2017 将我的应用程序发布为 ClickOnce 应用程序,一切正常,无一例外。问题已解决!

Visual Studio 2013 和 Visual Studio 2017 发布应用程序的方式明显不同,因为 VS 2013 不需要 "fix",但 VS 2017 需要。