从VS 2013而不是VS 2017发布时,为什么具有嵌入式Adobe Reader Control的应用程序可以工作?

时间:2018-09-04 18:56:42

标签: c# visual-studio winforms clickonce manifest

我的应用程序使用“ Adob​​e PDF Reader”控件在Windows窗体上查看PDF文档。它作为ClickOnce应用程序发布。如果我使用Visual Studio 2013发布它,它将安装并正常运行。但是,如果我使用Visual Studio 2017发布(未对解决方案进行任何更改),它将安装但无法运行。它引发此错误: System.IO.FileNotFoundException:无法加载文件或程序集“ AxInterop.AcroPDFLib,版本= 1.0.0.0,区域性=中性,PublicKeyToken = 963d585c671a3ae6”或其依赖项之一。系统找不到指定的文件。

因此,我去了Visual Studio中的“发布/应用程序文件...”,以包含丢失的dll,只是发现我由于未列出而无法将其包含。

在VS 2017中,“应用程序文件”窗口如下所示: enter image description here

但是在VS 2013中,“应用程序文件”窗口如下所示: enter image description here

现在在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中发布时,清单文件中缺少上述XML。

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

我需要做什么才能使VS 2017发布版本包含必需的依赖项信息?这是一个错误,还是我缺少什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

  1. 在VS 2017中,为Debug和Release版本进行“构建/批处理构建”。注意:这样,VS会将必要的文件“ AxInterop.AcroPDFLib.dll”和“ Interop.AcroPDFLib.dll”放入Bin \ Release文件夹。
  2. 现在添加引用(使用“浏览”选项)以将引用添加到Bin \ Release文件夹中的“ AxInterop.AcroPDFLib.dll”和“ Interop.AcroPDFLib.dll”文件。
  3. 在“解决方案资源管理器/参考”中,右键单击Interop.AcroPDFLib.dll,然后在菜单上选择“属性”。然后在“属性”窗口中,将“嵌入互操作类型”更改为False。
  4. 现在转到“项目属性/发布/应用程序文件”,然后将这两个dll的“发布状态”设置为“包含”(不是“包含(自动)”)。

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

Visual Studio 2013和Visual Studio 2017发布应用程序的方式之间显然存在差异,因为此“修复”在VS 2013中不是必需的,而在VS 2017中是必需的。