条件访问修饰符?

时间:2016-10-31 19:12:14

标签: c# dll conditional access modifier

我公司的软件产品有一个非常大的DLL(大约11 MB),我已经分配了通过制作两个或三个版本的DLL来减少其大小的任务,只允许每个DLL中提供的方法列表。当前的DLL有各种方法,但我们的大多数客户只使用某些方法集,具体取决于他们的行业。

我有7个项目的解决方案:两个是C ++项目,五个是C#。其中两个C#项目调用来自C ++项目的函数(使用dllexport),我认为它被称为非托管代码(请耐心等待,我是这个领域的新手,所以我不太了解术语 - 实际上我刚刚发现" public / private / protected / etc"被称为"访问修饰符"!:-))

到目前为止,我已经找到了如何定义一个解决方案范围的预处理器常量,以便与#34;#if"一起使用。到目前为止,我已经提出以下内容来创建三个DLL:

例如,类似下面的内容在.cs文件之一中:

#if DLL_FOR_INDUSTRY_A
public void method_A(int arg1)
#else
private void method_A(int arg1)
#endif
{
  for (int x=0; x<arg1; x++)
  {
  // code here;
  }
}

#if DLL_FOR_INDUSTRY_B
public void method_B(int arg1)
#else
private void method_B(int arg1)
#endif
{
  // code here;
}

#if DLL_FOR_INDUSTRY_C
public void method_C(int arg1)
#else
private void method_C(int arg1)
#endif
{
  // code here;
}

但我的问题是我在整个DLL中有大约400多种方法!有些方法在我应该创建的新DLL中很常见。其中两个新DLL将代表软件版本(将其视为&#34;标准&#34; vs&#34;专业&#34;版本。)我还看了使用&#34; [System.Diagnostics .Conditional] &#34;但是如果方法是&#34;公共方法_A(int x)&#34; 而不是像&#34; public void method_A(int x)那样它就不起作用)&#34; 即可。如果我添加&#34; void&#34;在现有的方法中,它打破了很多其他的电话(噩梦!)而且我不是这个领域的专家,所以我不能告诉哪种方式更好的方法。

我的问题 - 是否有人有更好的建议我应该如何正确地做到这一点?更好的是,如果有人可以指出我正确的方向,如何这样大的DLL可以&#34;有条件地&#34;编译,以便我可以设置预处理器常量来更改DLL结果。 (我尝试使用上面显示的内容进行编译(仅覆盖大约15种方法而不是400多种方法,它的工作量很大)但是DLL大小似乎没有改变,不确定是否仍然将未使用的方法编译到新的DLL。)

可以制作访问修饰符&#34;条件&#34;以一种更简单的方式? (这样它们就不会出现在输出DLL中。)

请帮忙!我在Windows 7和Windows上使用Visual Studio 2015 Windows 10。 我真诚地感谢任何可以给我一些方向的人,我在过去的5天里一直在这个方面,包括周末,但我没有很好的解决方案。 : - (

1 个答案:

答案 0 :(得分:1)

我建议在这里使用继承而不是条件编译 - 例如,拥有一个基类,该基类包含所有行业使用的通用功能,以及包含行业特定功能的不同行业的实现。然后,您可以将其拆分为多个程序集,为每个人提供具有通用功能的DLL以及包含与其特定行业相关的代码的第二个DLL。

你肯定想做很多&#34;如果&#34;声明做行业特定的事情。我记得大约10年前为一家公司工作,其代码类似于

if (client == x) ...
else if (client == y) ...
else ...

可以预见,这很快就变得很难维持。为了记录,代码是在我到达之前编写的,所以这不是我的错;)。在他们的情况下,他们可以从使用Template Method Pattern而不是做客户特定推理中受益。 (在这种情况下,Strategy PatternFactory Pattern通常都非常有用。)