ClickOnce要求许可协议。

8

在Win Form应用程序中,是否可以构建ClickOnce部署,要求用户在继续之前同意许可协议?

6个回答

11

来自 MSDN 的答案 由用户 Heath8041 提供:

在 VS2005 中获取您的 ClickOnce 应用程序显示 EULA 的巧妙方法

这是一种获取终端用户许可协议的单击安装应用程序的迂回方法。 基本上,您需要构建一个可重复使用的分发组件,该组件可以在发布窗口下的先决条件对话框中看到。这样可以很好地实现所有应用程序重用相同的协议。 非常简单,您只需要创建三个文件("eula.txt","product.xml"和"package.xml")和两个文件夹("EULApackage"和"en")。我在下面记录了我设置的所有内容。它运行得很好。您唯一需要更改的是组件的名称,当然还需要将您自己的终端用户许可协议保存为eula.txt。 组件需要放置在以下路径中: C:\ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ BootStrapper \ Packages 在此文件夹中,您应该看到其他可再发行组件的一些子文件夹。首先为您的组件创建一个新的子目录。我称之为EULApackage。 在这个新文件夹中,您需要以下内容。 -名为product.xml的文件和名为"en"的子文件夹(用于英语) 您可以使用product.xml文件执行各种操作,但是这是我的方式
<?xml version="1.0" encoding="utf-8" ?>

<Product
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  ProductCode="EULA.Bootstrap.Component"
>
  <!-- Defines list of files to be copied on build -->
  <PackageFiles>
    <PackageFile Name="en/eula.txt"/>
  </PackageFiles>


  <Commands>
    <Command PackageFile="en/eula.txt"
      Arguments='' >

       <ExitCodes>
         <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
       </ExitCodes>

    </Command>
  </Commands>
</Product>

在这种情况下,eula.txt文件是我的许可协议文本文件。请注意,它不是rtf文件。使用此方法无法正确显示rtf。
现在,在我的“en”子文件夹中,我放置了eula.txt文件和另一个名为package.xml的xml文件,同样,这个xml文件可以用来做各种各样的事情。
这是我的版本内容。
 <?xml version="1.0" encoding="utf-8" ?>

<Package
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  Name="DisplayName"
  Culture="Culture"
  LicenseAgreement="eula.txt">

    <PackageFiles>
        <PackageFile Name="eula.txt"/>
    </PackageFiles>

  <!-- Defines a localizable string table for error messages and url's  -->
  <Strings>
    <String Name="DisplayName">Texas Instruments End User License Agreement</String>
    <String Name="Culture">en</String>

    <String Name="CancelFailure">User Failed to Accept Texas Instruments End User License Agreement.</String>
    <String Name="GeneralFailure">A fatal error occurred during the installation of ELUA Component Execution</String>
    <String Name="AdminRequired">You do not have the permissions required to install this application.  Please contact your administrator.</String>
  </Strings>    
</Package>

注意:无论您在DisplayName字段中放置什么,用户在面对最终用户许可协议文本时都会看到它。如果您已经正确地将所有内容放在正确的文件夹中,下次启动VS2005并转到发布选项卡->先决条件,您应该会看到DisplayName字段。只需将其作为应用程序的前提条件进行检查即可。 当用户单击publish.htm文件上的安装时,它将向用户呈现标准许可接受对话框中eula.txt文件的内容。如果他们选择接受,则您的东西将被安装,如果他们拒绝,则它会很好地退出,并且不会安装任何内容到他们的系统中。 如果您在两个文件中的任何一个中弄乱格式或者如果您遗漏了“en”子文件夹,那么组件就不会显示在先决条件对话框中(在发布时)。
附加说明:虽然这种方法非常有效,但是有一些绕过最终用户许可协议的方法,例如如果您的publish.htm文件允许他们直接运行应用程序(我猜没有引导程序的情况下),但如果他们单击安装按钮,它将运行。 这也有好处,可以避免每次发布ClickOnce应用程序更新时都运行。 他们必须运行引导程序才能使eula显示出来(通过单击publish.htm上的安装按钮)。 我通过查看路径C:\ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ BootStrapper \ Packages中已经存在的其他可再分发组件之一来找出了这种方法。 您可以查看那些其他组件的product.xml和package.xml文件,以了解他们所做的一些很酷的事情。祝你好运

1
非常好,我正在使用Visual Studio 2008,所以路径是C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\Eula - Coppermill
在 Windows 7 64 位系统中,该位置为 C:\Program Files (x86)\Microsoft SDKs\Windows\V6.0A\BootStrapper\Packages\。 - ForeverWintr
1
如果其他人也在努力让它工作,阅读Shay引用的整个线程以找到完整的解决方案。 - ForeverWintr

2

如果有人想要这样做,它会起作用……我正在使用Visual Studio 2008,就像Coppermill说的那样,位置是“C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\”

我还需要在product.xml中添加一些其他内容:

<?xml version="1.0" encoding="utf-8" ?>

<Product
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  ProductCode="EULA.Bootstrap.Component"
>
  <!-- Defines list of files to be copied on build -->
  <PackageFiles CopyAllPackageFiles="false">
    <PackageFile Name="en/Empty.exe"/>
  </PackageFiles>


  <Commands>
      <Command PackageFile="en/Empty.exe" Arguments='/silent' >
       <ExitCodes>
    <ExitCode Value="0" Result="Success"/>
         <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
       </ExitCodes>

    </Command>
  </Commands>
</Product>

我还得创建一个“无操作”可执行文件,否则elcu.txt会在记事本中打开。祝你好运...


我现在正在苦恼这个问题。你是如何添加一个“什么也不做”的exe的?你说的在product.xml中添加</Command>是什么意思? - bluebit
忽略关于添加</Command>的注释...我不记得为什么要发布它。至于“什么也不做”的可执行文件,我只编译了一个简单的C++程序,它立即退出。我不得不这样做,因为它会在下载elua.txt作为先决条件后在记事本中打开它,这不是我想要发生的事情。 - Nate
你也可以使用一个空的 .bat 文件来达到同样的效果。 例如: echo "ELUA Accepted" (保存在一个 bat 文件中)<!-- 定义构建时要复制的文件列表 --> <PackageFiles> <PackageFile Name="en/eula.bat"/> </PackageFiles> - Nate

1

我认为没有这样的方法。

如果您从网页部署单击启动应用程序,您可以要求用户在安装应用程序之前接受该协议。效果将是相同的。


1
如果我们使用Visual Studio 2010,那么我们需要将它添加到"C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages"文件夹中。现在它可以工作了。

1

0
我正在将这篇文章作为对Yuki Izumi的帖子的回复发布。我没有使用批处理文件,而是添加了一个空的vbs文件,并修改了product.xml,来...
<Command PackageFile="en/empty.vbs" Arguments='' >

这是另一种防止在单击“接受”时打开eula.txt的方法。我还尝试了使用rtf文件,它可以正确显示(VS2015)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接