根据环境切换DLL - .net

时间:2010-01-22 19:57:20

标签: .net dll

我想发布一个包含一些类的DLL供其他开发人员使用。这些类的后面是另一个包含引用功能的DLL。在开发环境中,我希望这个后端DLL具有面向开发的功能,但是当代码迁移到生产环境时,我希望后端DLL是真正的DLL。切换后端DLL的最佳方法是什么?

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

继续发表评论:

  

我一直在试验,而且它   看来,只要我定义了   相同的类,DLL名称保持不变   同样,物理上改变DLL   在目录中工作正常。你呢   知道任何问题,或   这种方法的垮台?

这种方法的主要问题/缺点是确保您将两个DLL暴露的类/方法保持在锁定步骤中。可能是最好的方法,因为你似乎有一个模型:

PROGRAM -> REFERENCED DLL -> [One of two "Backend DLL's]

将在“REFERENCED DLL”中创建抽象类/接口,指定两个“后端DLL”应该公开的类/方法,然后让后端DLL引用“REFERENCED DLL”并实现实际的类 - 抽象类/接口的顶部。

例如,“Program”希望能够在REFERENCED.DLL中使用一个名为“Logger”的类,该类使用BACKEND.DLL中名为“BackEndLogger”的clas中的方法(无论是开发版还是生产版) 。因此,在REFERENCED.DLL中有一个类,如:

public abstract class BackEndLogger
{
    public virtual void LogEvent(string eventToLog)
}

然后,在“BACKEND.DLL”的两个版本中,都有一个类如:

public class Logger : BackEndLogger
{
    public override void LogEvent(string eventToLog)
    {
    ... code for implementation goes here
    }
}

REFERENCED.DLL将引用一个名为“BACKEND.DLL”的DLL,并且因为类接口完全相同(通过在REFERENCED.DLL中实现抽象类/接口使它们保持同步来确保这一点) )将不再是明智的。

希望这有点意义=)

答案 1 :(得分:0)

使用.config文件存储要运行的程序集的名称,并在空/缺少时加载后端版本。 [更多]最简单的方法是使用另一个包含共享接口的程序集。

答案 2 :(得分:-1)

尝试使用ConditionalAttribute标记“仅限开发人员”类。如:

[Conditional("DEBUG")]
public class DeveloperClass
{
    // ...
}

你也用这种方式标记方法。它比使用#if /#endif更清晰一些。这样,您可以共享所有源代码,但只需使用解决方案配置即可更改您构建的源代码。

答案 3 :(得分:-1)

所以我假设你的'开发'dll和'生产'dll都有相同的界面?

如果是这样,那么在dll上只有一个Wrapper,Wrapper会将所有函数包装在dll中(对于这两个版本的dll,接口都是相同的)。

使用以下代码加载库

if(PRODUCTION) {
        target_lib = "productionlib.dll";
} else {
        target_lib =  "developmentlib.dll";
}
lib = LoadLibrary(target_lib);

Wrapper只会将函数调用转发到相应的已加载库(如上所述的生产或开发库)

functionptr=(LPFunctionType)GetProcAddress(lib,"TargetFunction");
if(functionptr) { functionptr(bs); }