我想发布一个包含一些类的DLL供其他开发人员使用。这些类的后面是另一个包含引用功能的DLL。在开发环境中,我希望这个后端DLL具有面向开发的功能,但是当代码迁移到生产环境时,我希望后端DLL是真正的DLL。切换后端DLL的最佳方法是什么?
感谢您的帮助。
答案 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); }