【问题标题】:Embed individualized code into ClickOnce setup.exe?将个性化代码嵌入 ClickOnce setup.exe?
【发布时间】:2011-09-03 05:10:27
【问题描述】:

我知道可以通过 URL 将参数传递给在线启动的 ClickOnce 应用程序。但是,大多数用户下载 setup.exe 并从他们的计算机上启动它。有什么方法可以在下载时重新编写 setup.exe,插入代码(比如说用户的电子邮件地址),然后在知道代码的情况下启动应用程序?假设我们可以以某种方式重新签署 setup.exe 以使其合法。

假设 .NET 3.5。

更新这里的目标是将电子邮件地址和/或推荐人信息传递给 setup.exe,这样即使用户从不同的机器和不同的 IP 运行安装程序,我们也可以计算出找出谁做了推荐。

更新 2 假设 .NET 3.5 SP1,它有帮助吗?显然,现在可以在离线时将参数传递给 .application。是否可以在 setup.exe 中嵌入参数,以便在 setup.exe 运行时调用 .application?ref=someone?

【问题讨论】:

    标签: c# clickonce


    【解决方案1】:

    好吧,如果您的目标是将客户 ID(电子邮件、代码等)嵌入到 exe 中,我能想到的最简单的方法是使用 IPropertyStorageIPropertySetStorage 接口。如果你有勇气,你可以通过p/invoke直接在IPropertySetStorage上调用方法,或者你可以走简单的路线,使用微软准备好的COM包装器,称为dsofile.dll

    请注意,虽然 dsofile 用于办公文档,但它确实适用于任何文件 - 包括 .exe 文件 - 您只是被预定义的属性名称所困扰。为什么不将您的客户 ID 放入 .Comments 属性中。只需以您可以再次解析它的方式进行操作即可。

    这是一个示例:

    var doc = new OleDocumentPropertiesClass();
    doc.Open(pathToFile);
    doc.SummaryProperties.Comments = "joe@test.com";
    doc.Save(); 
    

    当然,你需要先将它复制到一个临时位置,然后在用户下载它一段时间后,你会想要删除它。

    您可以将 dsofile.dll 与您的应用程序捆绑在一起,并将其注册为依赖项,然后在您的安装程序中使用它来读取该属性。或者,如果您可以在没有它的情况下 p/调用 IPropertyStorage,那么您将没有依赖关系。

    要研究的另一件事是使用由 Shell32.dll 读取的扩展文件属性。我只是无法找到一种干净的方式来轻松地编写它们。如果您走这条路,请分享您如何将属性写入 .exe。

    【讨论】:

    • 这是一个真正创新的想法。我喜欢。你知道我是否可以确定用于安装 .application 的 setup.exe 文件吗?
    • 这个想法是在安装过程中使用数据本身,因此它将是正在运行的进程的图像文件。现在,我对 ClickOnce 的操作并不多,因此我无法确定您在安装时会如何操作。如果这是常规 MSI,您可以将其作为自定义操作来实现。我使用 WiX 为我的安装创作 MSI。 ClickOnce 很好,但可能会受到限制。
    【解决方案2】:

    看看 InPlaceHostingManager 类是否可以在这种情况下为您提供帮助。它可能不会完全按照您的要求进行。不过或许能帮上忙……

    任何基于 .exe 文件的 ClickOnce 应用程序都可以静默运行 由自定义安装程序安装和更新。自定义安装程序可以 在安装过程中实现自定义用户体验,包括自定义 用于安全和维护操作的对话框。去表演 安装操作,自定义安装程序使用 InPlaceHostingManager 班级。

    Walkthrough: Creating a Custom Installer for a ClickOnce Application

    编辑

    我不确定您是否可以完全按照您在问题中描述的方式实现您想要的。检查这些线程是否对您有帮助。

    Accessing Local and Remote Data in ClickOnce Applications

    How to include custom data files in ClickOnce deployment?

    How to: Retrieve Query String Information in an Online ClickOnce Application

    【讨论】:

    • 您好 CharithJ,感谢您的建议,但我不知道如何才能让它做我想做的事。目标实际上是将推荐信息嵌入到 setup.exe 中,这样即使他们稍后下载并运行 setup.exe(即使从不同的 IP 地址),我也可以跟踪谁推荐了下载。
    • 您真的要将推荐信息写入设置吗?如何将推荐信息写入注册表或某个配置文件并在运行设置时读取?
    • 这不是一个坏主意。我猜在这种情况下 setup.exe 可能会以 zip 文件的形式提供,这样当他们运行它时,它将读取与 zip 文件打包在一起的配置文件。
    【解决方案3】:

    您如何想象在下载时“重写”setup.exe?如果用户没有使用提供的链接 (url) 打开您的应用程序,而是直接从网络共享在本地下载文件,则您无法拦截。

    我会尝试使用权限并让用户通过提供给他们的链接执行它,但无法直接连接到共享或网址并下载它。不确定这是否可能。

    【讨论】:

    • 不是真正的 setup.exe,webhost 会将 setup.exe 定向到修改 setup.exe 并将位传递给用户的脚本。
    【解决方案4】:

    您可以尝试将该信息作为资源嵌入到 exe 中。 这是一个更新 exe 资源的 c++ 示例。 http://msdn.microsoft.com/en-us/library/ms648008(v=vs.85).aspx#_win32_Updating_Resources

    【讨论】:

    • 此 exe 由 ClickOnce 创建,用于部署 .NET 应用程序。
    • 你应该可以修改任何exe的资源表,不管你是否创建它。此外,您可以创建一个启动器 exe,将 clickonce exe 作为资源,将用户信息作为资源。然后当它运行解包并运行 clickonce 然后你的应用程序可以从启动器获取资源
    【解决方案5】:

    您应该结合 Charith 和 Josh 的方法 - 本质上,配置您的 Web 服务器,以便您可以根据 URL 参数生成新设置。使用自定义安装程序从 setup.exe 资源中读取引用信息。检查this link 以了解如何在 C# 中操作本机应用程序的资源 - 您必须在生成设置时写入资源文件,并且需要从自定义安装程序中读取它。

    另一种生成自定义设置的方法是从嵌入必要信息的命令行构建可执行文件或帮助程序集。然后从命令行工具构建设置(参见http://msdn.microsoft.com/en-us/library/xc3tc5xx.aspx)。与修改已构建设置的资源相比,生成自定义设置似乎很麻烦,并且需要很长时间。

    一种完全不同的方法是在用户下载应用程序时通过电子邮件发送唯一的推荐代码(注册代码)。在设置(或应用程序)中,使用自定义安装程序提示用户输入此代码。如果设置是通过 URL 调用的,那么代码将从那里可用,在这种情况下,自定义安装程序不需要请求代码。您在用户下载安装程序时发送的电子邮件应通知用户将代码与安装程序文件一起保存到某个文本文件中。

    【讨论】:

    • 您好,Vinay,感谢您的建议。事实上,当前的解决方案是通过电子邮件向用户发送代码。但是,我认为我们可以做得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多