我们有一个带棱镜的WPF项目。我们正在动态加载一些模块,这些模块基本上放在子文件夹中(PrismModules)。
应用程序工作正常,但现在如果我们尝试使用ClickOnce部署它,它会忽略输出路径结构并将所有内容放在根文件夹而不是我们的" PrismModules"子文件夹。然后应用程序不会加载这些模块。
这是ClickOnce部署的限制吗?
修改
为了提供更多信息,以下是解决方案的结构:
Solution
- WpfClient
- PrismModules
- Module A
- Module B
- Module C
它们都构建在同一个根目录中,模块A / B / C就在子文件夹PrismModules
中。
WpfClient不会引用任何模块,它会在运行时扫描文件夹PrismModules
并加载包含IModule
实现的所有Dll。
我注意到了什么:
引用的某些DLL放在根目录上(而不是PrismModules
文件夹中),而且只有动态加载的DLL甚至不存在(我们无法在ClickOnce菜单中为它们设置任何内容。
答案 0 :(得分:0)
在您的主项目(由ClickOnce部署)中,创建一个子文件夹PrismModules,并将模块的dll添加为链接。将“BuildAction”设置为“内容”,将“复制到输出目录”设置为“始终复制”。
在WpfClient下创建一个子文件夹PrismModules并添加链接到它。从输出位置获取dll(无论ModuleA的输出位置是什么,......)
进行额外检查:在Deploy / Application Files下,添加的dll应标记为“Included”而不是“Data Files”。通常VS会这样做。
正确设置解决方案的构建顺序:WpfClient应该依赖于您的模块X,这样您就无法使用旧的dll部署新版本的应用程序。
步骤一步:
构建所有项目(在发布中)。
站在WpfClient上,右键单击选择“添加新文件夹”,将其命名为PrismModules。
站在新创建的PrismModules上,右键单击选择“添加现有项”。导航到您构建的模块dll,无论它位于何处。而不是“添加”,按“添加为链接”(注意“添加”右侧的三角形)。