我正在编写一个插件,但我需要每个 Windows Phone 版本的特定实现。
问题是插件系统将尝试根据约定加载平台插件程序集。在这种情况下,“WindowsPhone”。
我们可能会尝试覆盖CreatePluginManager,但它会影响您可能需要的其余插件。
我正在考虑生成两个具有不同名称但具有相同程序集和命名空间的不同项目。我认为,这将解决加载特定插件的问题,但我真的不知道如何面对 Nuget 的最终发布。
最好的祝福,
罗伯托。
我正在编写一个插件,但我需要每个 Windows Phone 版本的特定实现。
问题是插件系统将尝试根据约定加载平台插件程序集。在这种情况下,“WindowsPhone”。
我们可能会尝试覆盖CreatePluginManager,但它会影响您可能需要的其余插件。
我正在考虑生成两个具有不同名称但具有相同程序集和命名空间的不同项目。我认为,这将解决加载特定插件的问题,但我真的不知道如何面对 Nuget 的最终发布。
最好的祝福,
罗伯托。
生成具有相同名称的程序集是一种可行的方法——这是 Microsoft Pcl 团队经常做的事情——这是参考程序集的工作方式。
这些的 nuget 分发不应该是一个问题 - 但会是一个“faff” - 因为 nuget zip 文件会为不同的文件使用不同的文件夹。但是,如果您希望单个项目同时构建 wp7 和 wp8 配置,则可能需要在 .targets 级别上做一些工作(这类似于 winrt nuget 包中程序集的 x86/x64/arm 变体所需的工作) .
事实上,我认为不使用相同名称的主要原因是非常简单的原因,即这样很容易陷入混乱。
如果对于这个插件,您想在安装过程中覆盖插件管理器,您可以提供基于以下的自定义加载功能
protected virtual string GetPluginAssemblyNameFrom(Type toLoad)
以添加基于某些属性的特殊toLoad
- 例如if (toLoad.Name.EndsWith("Foo")) toReturn += PlatformPostfix
如果这种模式变得普遍 - 无论是对于 wp 还是对于其他版本化平台 - 那么我们可以将一些东西重新包含到框架中 - 尝试版本中性加载然后为每个插件执行特定于版本的加载将很容易。
还有其他方法可以解决这个问题......
例如,另一种可能性/机会是您的插件核心文件可以尝试自己加载多个平台适配 - 例如使用类似的代码
public void EnsureLoaded()
{
var manager = Mvx.Resolve<IMvxPluginManager>();
manager.TryEnsurePlatformAdaptionLoaded<PluginLoader>();
manager.TryEnsurePlatformAdaptionLoaded<Sub1.PluginLoader>();
manager.TryEnsurePlatformAdaptionLoaded<Sub2.PluginLoader>();
}
这将尝试为该插件加载三个子程序集 - MyPlugin.WindowsPhone、MyPlugin.Sub1.WindowsPhone 和 MyPlugin.Sub2.WindowsPhone,尽管您只会在每个平台上打包其中一个。