Assemblies 我希望我的DotNetNuke模块在尽可能多的版本下工作,同时避免程序集绑定重定向

Assemblies 我希望我的DotNetNuke模块在尽可能多的版本下工作,同时避免程序集绑定重定向,assemblies,dotnetnuke,versioning,dotnetnuke-module,Assemblies,Dotnetnuke,Versioning,Dotnetnuke Module,我正在开发DotNetNuke模块,自然希望在安装或分发它们之前对它们进行编译。过去,我只是通过浏览本地DotNetNuke安装的/BIN文件夹来引用DotNetNuke.dll的特定版本 这个引用允许我使用DNN基类,并在这些基类上创建我自己的类集。在我需要的DNN名称空间/类中,我还使用了各种帮助器方法。(即,从其PortalModuleBase、ModuleSettingsBase生成派生类,并使用其本地化类替换Microsoft ASP.NET实现提供的本地化类。) 我能够通过这种方法直

我正在开发DotNetNuke模块,自然希望在安装或分发它们之前对它们进行编译。过去,我只是通过浏览本地DotNetNuke安装的/BIN文件夹来引用DotNetNuke.dll的特定版本

这个引用允许我使用DNN基类,并在这些基类上创建我自己的类集。在我需要的DNN名称空间/类中,我还使用了各种帮助器方法。(即,从其PortalModuleBase、ModuleSettingsBase生成派生类,并使用其本地化类替换Microsoft ASP.NET实现提供的本地化类。)

我能够通过这种方法直接引用DLL(Copy Local=True,Specific Version=False),因为到目前为止,我一直在将这些模块安装到我维护的客户端网站上。因此,我至少在我开发的DotNetNuke版本或更新版本上保留了它们。最近,我在开发中引用了6.1.3.108

注意:这会自动将以下关联DLL复制到我的模块的/BIN目录中:

  • DotNetNuke.dll
  • DotNetNuke.Instrumentation.dll
  • dotnetnuke.log4net.dll
  • DotNetNuke.Services.Syndication.dll
  • DotNetNuke.Web.Client.dll
  • DotNetNuke.WebControls.dll
  • DotNetNuke.WebUtility.dll
将其安装到更新版本的DotNetNuke站点上运行良好,这是一个不错的开始

但我一直想知道的是,是否有一种非黑客的方式使我的模块对DLL的次要、构建或修订级别不敏感

我意识到,我有责任确保产品(如果是在“中端”版本上开发的)仍然可以在稍早的版本和较新的版本上工作。也就是说,我觉得我可以对这些构建进行彻底的测试。对我来说,这比运行最古老的主要内置开发更为有利

换句话说,我不希望开发时引用6.0.0.0,这样它就可以在6.x.x.x上工作,而不需要额外的努力。只有当有人没有一个优秀的方法让我去做参考时,我才会这么做,比如说,6.1.3.108在稍早或稍晚的版本上工作。(当然,对于主要的版本更改,例如5.x.x.x或7.x.x.x,我可以使用不同的模块。)


提前谢谢

不要引用bin文件夹中的程序集,而是在源代码中保留DotNetNuke.dll的副本(以及任何其他引用),并在那里引用它。将支持的最旧版本放在那里,但在更新的站点上开发。在引用上设置Copy Local=False,这样就不会覆盖较新的版本,而且应该可以


通过这种方式,我们可以在开发运行在DNN 6.1.x上的模块时参考DNN 4.5.3。我多年来一直在使用这种方法,没有出现任何重大问题(除了偶尔忘记关闭“复制本地”和我的DNN站点神秘地爆炸)。

关于确定DNN在您从DNN子类化的类中的版本

假设您的类继承自DNNClass,但由于您引用了属性的早期版本,“NewProp”不存在,我会这样做。以下是如何做到这一点:

public class YourClass : DNNClass
{    
    public string NewPropSubstitute
    {
       get {

           string newPropVal = "your default if earlier DNN";
           System.Reflection.PropertyInfo pi = this.GetType().GetProperty("NewProp");
           if (pi != null)
               newPropVal = (string)pi.GetValue(this, null);
           return newPropVal;
       }
    }
}
这是一个基于内存的猜测,所以它可能无法编译,但你明白了。如果需要,您不必获取DNN版本—只要尝试通过反射获取属性—如果存在,则隐式地获得了正确的版本

当然,如果DNN版本不支持,此方法假定您可以用一个值替换后面的DNN属性(或方法)。但这一切都取决于你想做什么

如果您确实想查找DNN版本(版本安全且始终正确),您可以使用嵌入在我的版本安全jQuery包含代码中的代码,链接自以下博文:

这就是我的开发方式。对于支持各种版本,没有什么灵丹妙药。OP中描述的方法是我推荐的。如果需要,创建自己的扩展子类,并在这些子类中实现反射。很酷的东西,当我从回答我问题的两个人那里购买/推荐模块时,你知道这是一个紧密的社区。谢谢你的参与和我的忠诚@BruceChapman—您能否详细介绍一下如何使用扩展子类和反射。我已经扩展了关键模块和模块设置类。但是说我使用反射来确定加载了哪个版本的DotNetNuke,我如何利用它?(也许可以把它作为另一个答案添加进来,这样我至少可以给你一个支持的投票。)谢谢Bruce,我之前已经读过你的jQuery方法。我经常不喜欢写“如果这个,那么做,否则如果这个,那么做,否则如果,等等”的代码,但绝对公平地说,我没有想到任何方法来解决这个问题!所以,在JavaScript不再是“脚本ey”之前,它将是我们所拥有的一切。再次感谢!(顺便说一句:当我和你聊天时,我禁不住想念澳大利亚。几年前我在那里住了一年多。希望去年夏天天气不太干燥,你的足球队赢了。去柯林伍德吧!)