条件访问修饰符

本文关键字:访问 条件 | 更新日期: 2023-09-27 18:15:47

我的公司有一个软件产品,它有一个非常大的DLL(大约11 MB),我被分配了一项任务,通过制作两个或三个版本的DLL来减少它的大小,只允许在每个DLL中提供方法列表。当前的DLL拥有所有方法,但我们的大多数客户只使用特定的方法集,这取决于他们的行业。

我有7个项目的解决方案:两个是c++项目,五个是c#。两个c#项目调用来自c++项目的函数(使用dllexport),我认为它被称为非托管代码(请原谅我,我是这个领域的新手,所以我不太了解术语-事实上我刚刚发现"公共/私有/受保护/等"被称为"访问修饰符"!: -)

到目前为止,我已经弄清楚如何定义一个解决方案范围的预处理器常数与"#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;
}

但我的问题是,我有大约400+方法在整个DLL!有些方法在我将要创建的新dll中是通用的。两个新的dll将代表软件版本(可以把它想象成"标准"answers"专业"版本)。我还研究了使用"[System.Diagnostics]"。条件条件]"但如果方法是则不起作用"而不是像"public void method_A(int x)"。如果我在现有方法中添加"void",它会中断许多其他调用(噩梦!)另外,我不是这方面的专家,所以我不知道哪种方法会更好。

我的问题-有没有人对我应该如何正确地做这件事有更好的建议?如果有人能告诉我如何"有条件地"编译这么大的DLL,以便我可以设置一个预处理器常数来改变DLL的结果,那就更好了。(我试着用我上面展示的编译(只覆盖大约15个方法而不是400+,这是很多工作),但DLL大小似乎没有改变,不确定是否未使用的方法仍然被编译成新的DLL)

访问修饰符可以更容易地成为"条件"吗?(这样它们就不会显示在输出的DLL中。)

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

条件访问修饰符

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

你肯定想做很多"if"语句来做行业特定的事情。我记得大约10年前在一家公司工作,它的代码像

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

可以预见,这很快就变得非常难以维护。声明一下,代码是在我到达那里之前编写的,所以这不是我的错;)。在他们的案例中,他们可以从使用模板方法模式而不是进行特定于客户端的推理中获益。(策略模式和工厂模式在这种情况下都非常有用)。