System.Addin&的ClickOnce

时间:2008-12-12 22:00:46

标签: c# clickonce system.addin

我在使用带有ClickOnce的System.Addins API时遇到了令人讨厌的构建过程。使用System.Addins需要特定的目录结构,主项目不直接引用适配器,视图和合同,这对ClickOnce架构不起作用。

构建过程中令人讨厌的部分是我必须通过post build事件将.dll从加载项组件复制到主应用程序项目的目录中,然后从主项目中手动引用这些文件,这样ClickOnce将包含它们。首先,这需要2次迭代构建才能使其正确构建,其次,它会干扰源代码控制(我必须从源代码控制中排除复制的附加dll文件,否则对它们所做的任何更改都需要签出)。

所以,我的问题是,有没有办法绕过这个黑客?更优雅的东西?

5 个答案:

答案 0 :(得分:3)

我无法完全回答您的问题,但您似乎正在通过Visual Studio创建ClickOnce部署。我会放弃这种方法,而是使用MageUI。它是一个独立的可执行文件,可以在框架SDK中找到,它将生成应用程序和部署清单文件。它附带一个gui版本(mageui.exe)和一个命令行版本(mage.exe)。

Mage可能无法摆脱你的构建后事件,但它不应该引用文件来让ClickOnce看到它们。

答案 1 :(得分:0)

我通过将管道程序集作为内容添加到主解决方案结构中解决了这个问题。

要执行此操作,请将输出文件夹从(/ bin / debug / bin / Release)更改为其他内容。我使用../lib否则你会得到一个visual studio无法引用这个文件错误。

在主解决方案中创建管道文件夹

  • \ AddInSideAdapters
  • \ AddInViews
  • \合同
  • \ HostSideAdapters

右键单击每个文件夹并单击“添加现有项目”更改以查看所有文件,然后浏览到您的../lib(或您输出设置的任何位置),然后下拉添加按钮(单击向下箭头)并单击“添加为链接”。

右键单击每个文件并将其设置为“内容”。

这将创建一个指向程序集的刷新文件,它们将包含在clickonce清单中。

答案 2 :(得分:0)

感谢您的投入,我目前按照您提到的方式进行投入;在我的项目中创建文件夹,并包含我需要的dll。它有效,但它是一个丑陋的解决方案,它干扰源控制。

我知道ClickOnce的局限性,我希望可能有办法绕过它。例如,我在某处读到了我可以使用部署项目来创建特定结构中所需的适当依赖项。问题在于,一旦将其部署到公众,就没有简单的方法(在ClickOnce中)来更新这些依赖项。

答案 3 :(得分:0)

我使用的解决方案是为所有项目提供单个输出文件夹。每个项目都将自己的文件放在正确的子文件夹中。应用程序引导程序项目将其dll也放在输出(根)文件夹中。然后,当您为引导程序创建click-one时,它将从输出文件夹中获取所有内容。

最难的部分是将所有dll放在正确的位置(并且每个dll只有一次)

答案 4 :(得分:-1)

ClickOnce不允许您根据需要安装软件。它将在文档和设置中安装二进制文件和dll。您可以在项目属性中进入“发布”选项卡,然后选择“应用程序文件”以选择要包括的其他文件。如果System.Addings需要相对于程序集的特定文件夹中的dll,您可能只是在项目中创建该文件夹,并从此处包含dll。这可能有效。如果没有,我没有“黑客”或其他解决方案,clickonce很棒,但有一些功能限制。