默认情况下,首次运行应用程序时会下载 ClickOnce 应用程序中包含的所有程序集。 但是,应用程序的某些部分可能由一小部分用户使用。 在这种情况下,只有在创建程序集类型之一时,才需要下载程序集。 以下演练演示如何将应用程序中的某些程序集标记为“可选”,以及如何在公共语言运行时要求它们时使用命名空间中的 System.Deployment.Application 类下载它们。
注释
ApplicationDeployment 类和System.Deployment.Application 命名空间中的 API 在 .NET Core 和 .NET 5 及更高版本中不受支持。 在 .NET 7 中,支持访问应用程序部署属性的新方法。 有关详细信息,请参阅 .NET 中的 Access ClickOnce 部署属性。 .NET 7 不支持 ApplicationDeployment 方法的等效项。
注释
应用程序需要在完全信任的环境中运行才能使用此过程。
注释
你看到的对话框和菜单命令可能与“帮助”中所述的命令不同,具体取决于你的活动设置或版本。 若要更改设置,请单击“工具”菜单上的“导入和导出设置”。 有关详细信息,请参阅 “重置设置”。
创建项目
使用 Visual Studio 创建一个项目,该项目使用按需程序集
在 Visual Studio 中创建新的 Windows 窗体项目。 在 “文件 ”菜单上,指向 “添加”,然后单击“ 新建项目”。 在对话框中选择 类库 项目并将其命名
ClickOnceLibrary。注释
在 Visual Basic 中,建议您修改项目属性,将此项目的根命名空间更改为
Microsoft.Samples.ClickOnceOnDemand或您选择的命名空间。 为简单起见,本演练中的两个项目位于同一命名空间中。定义一个名为
DynamicClass的类,其中有一个属性名为Message。在 解决方案资源管理器中选择 Windows 窗体项目。 添加对程序集的 System.Deployment.Application 引用和对
ClickOnceLibrary项目的项目引用。注释
在 Visual Basic 中,建议通过修改项目属性,将此项目的根命名空间更改为
Microsoft.Samples.ClickOnceOnDemand或者一个您选择的命名空间。 为简单起见,本演练中的两个项目位于同一命名空间中。右键单击窗体,从菜单中单击“查看代码”,然后为窗体添加以下引用。
添加以下代码以按需下载此程序集。 此代码演示如何使用泛型 Dictionary 类将一组程序集映射到组名称。 由于我们只下载本演练中的单个程序集,因此组中只有一个程序集。 在实际应用程序中,你可能希望同时下载与应用程序中单个功能相关的所有程序集。 映射表使您可以轻松地将属于某个功能的所有 DLL 与下载组名称相关联。
// Maintain a dictionary mapping DLL names to download file groups. This is trivial for this sample, // but will be important in real-world applications where a feature is spread across multiple DLLs, // and you want to download all DLLs for that feature in one shot. Dictionary<String, String> DllMapping = new Dictionary<String, String>(); [SecurityPermission(SecurityAction.Demand, ControlAppDomain=true)] public Form1() { InitializeComponent(); DllMapping["ClickOnceLibrary"] = "ClickOnceLibrary"; AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); } /* * Use ClickOnce APIs to download the assembly on demand. */ private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { Assembly newAssembly = null; if (ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment; // Get the DLL name from the Name argument. string[] nameParts = args.Name.Split(','); string dllName = nameParts[0]; string downloadGroupName = DllMapping[dllName]; try { deploy.DownloadFileGroup(downloadGroupName); } catch (DeploymentException de) { MessageBox.Show("Downloading file group failed. Group name: " + downloadGroupName + "; DLL name: " + args.Name); throw (de); } // Load the assembly. // Assembly.Load() doesn't work here, as the previous failure to load the assembly // is cached by the CLR. LoadFrom() is not recommended. Use LoadFile() instead. try { newAssembly = Assembly.LoadFile(Application.StartupPath + @"\" + dllName + ".dll"); } catch (Exception e) { throw (e); } } else { //Major error - not running under ClickOnce, but missing assembly. Don't know how to recover. throw (new Exception("Cannot load assemblies dynamically - application is not deployed using ClickOnce.")); } return (newAssembly); }在 “视图 ”菜单上,单击“ 工具箱”。 将工具箱中的Button拖动到窗体上。 双击该按钮,并将以下代码添加到 Click 事件处理程序。
将程序集标记为可选
使用 Visual Studio 在 ClickOnce 应用程序中将程序集标记为可选
在 解决方案资源管理器 中右键单击 Windows 窗体项目,然后单击“ 属性”。 选择“ 发布 ”选项卡。
单击 “应用程序文件 ”按钮。
查找 ClickOnceLibrary.dll的列表。 将 “发布状态 ”下拉列表框设置为 “包含”。
展开 “组 ”下拉列表框,然后选择“ 新建”。 输入名称
ClickOnceLibrary作为新组名称。继续发布您的应用程序,如 如何:使用发布向导来发布 ClickOnce 应用程序。
使用清单生成和编辑工具在 ClickOnce 应用程序中将程序集标记为可选 — 图形客户端(MageUI.exe)
创建您的 ClickOnce 清单,如 演练:手动部署 ClickOnce 应用程序 中所述。
在关闭 MageUI.exe之前,请选择包含部署的应用程序清单的选项卡,然后在该选项卡中选择“ 文件 ”选项卡。
在应用程序文件列表中查找 ClickOnceLibrary.dll,并将其 “文件类型 ”列设置为 “无”。 对于 “组” 列,请键入
ClickOnceLibrary.dll。
测试新程序集
测试按需加载的程序集:
启动使用 ClickOnce 部署的应用程序。
当主窗体出现时,按Button。 应在消息框窗口中看到一个字符串,该窗口显示“Hello, World!”