Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-在分离的类库中外部化类_C#_Class_Dll_Structure - Fatal编程技术网

C#-在分离的类库中外部化类

C#-在分离的类库中外部化类,c#,class,dll,structure,C#,Class,Dll,Structure,好吧,首先请原谅,如果这里不是这样做的地方。这不是一个真正的问题,但我接触到了这个问题,很难找到必要的信息,所以我认为为它制作一个主题会很好。 这是在关注像我这样的C#初学者/平均水平的人,所以如果你有一些评论或更正,欢迎你 大约一年前,我在开发我的项目,使用了很多课程。但当我想将一些函数外部化时,我开始遇到问题 为什么要将我的功能外部化?为了使支持更容易。事实上,创建一个外部库类(.dll),如果将来我可能会对它进行一些修改,并向客户发送升级,我只需要修改并发送该库,而不是所有的代码。 问题是

好吧,首先请原谅,如果这里不是这样做的地方。这不是一个真正的问题,但我接触到了这个问题,很难找到必要的信息,所以我认为为它制作一个主题会很好。 这是在关注像我这样的C#初学者/平均水平的人,所以如果你有一些评论或更正,欢迎你

大约一年前,我在开发我的项目,使用了很多课程。但当我想将一些函数外部化时,我开始遇到问题

为什么要将我的功能外部化?为了使支持更容易。事实上,创建一个外部库类(.dll),如果将来我可能会对它进行一些修改,并向客户发送升级,我只需要修改并发送该库,而不是所有的代码。 问题是当我想使用这些库中的类时:这是不可能的

然后stackoverflower(感谢Simone Sifani)给了我一个好主意:我可以将我所有的类外部化到不同的项目中(每个类一个项目)。 在我的情况下,事情变得有点困难,因为所有的类都互相使用。。。因此,我将解释我是如何进行的

1) 显然,在开始之前要复制一份您的解决方案,所以如果您做错了什么,请删除所有内容,然后重新启动(这是一个很好的练习,可以很好地理解这些引用是如何工作的,经过一两次尝试,您都会理解)

2) 为要外部化的每个类在解决方案中添加一个项目(右键单击解决方案/添加新项目/类库),然后直接检查框架的版本,使其在所有解决方案中具有相同的版本(在我的例子中是.NET Framework 4.6.2)。如果不这样做,则不会出现错误消息,但如果没有必要的解释,调试将无法工作

3) 将原始类的所有代码复制/粘贴到新的相应类库中。然后在每个类定义之前添加“public”一词

class Myoldclass
    {
        ...
    }
变成

public class Myoldclass
{
    ...
}
4) 添加引用(这是最长的部分)

每个类可能需要不同的引用: -到.NET框架 -对于其他类(从现在起,我将不再使用“类”这个词,而是使用“库”)

我个人做了以下工作:

4-1)在注释中加入使用外部库所需的所有代码,因此现在您只会遇到关于.NET程序集上缺少的引用和一些“不存在的函数”(我刚才在注释中加入的函数)的错误。 我还建议你拿一张纸,为每个图书馆写下所需的参考文献清单

4-2)添加对必要的.NET程序集的所有引用(对我来说,这是作业中最长的一部分)。之后,您可能只有关于不存在的函数的错误

4-3)开始编译所有不需要使用任何外部库的库。然后,它将在其目录(bin\debug目录)中生成一个.dll文件。我将称之为Library1

4-4)在所有需要使用Library1的库中,添加对库的引用(Project/add/reference/Projects->Library1.dll文件)。因此,现在所有需要Library1的代码都可以正常工作。(我称之为Library2

4-5)一旦您认为Library2引用了所有必需的库,您可以取消对代码的注释。为此,我有两种解决方案:只需按住Ctrl+Z键,直到代码返回到步骤3。有时VS会在没有错误的地方发现错误,因此您需要重新启动它,因此返回是不可能的。 在我的例子中,我只是打开我的旧类,覆盖我库中的所有代码,重写类定义中的“public”…然后开始调试以生成Library2.dll文件

4-6)继续这样做,直到所有库都获得了所有引用(这就是为什么写在论文上很重要的原因,所以通过删除,您将首先调试需要很少引用的库,然后完成最困难的库)

4-7)在主项目上,添加对以前生成的所有DLL的引用

所有这些,在我完成之后,我的项目仍然像以前一样工作(在读取应用程序参数时仍然有一些问题,但我正在处理)。我的解决方案中有13个类库项目,我可以单独调试,每个人都可以使用任何人:)


希望这篇文章对某些人有用,如果stackoverflowers想要帮助/纠正,我会尽量保持更新。

创建尽可能多的项目有什么意义?在大多数情况下,我确实需要一个“通用”的“库,有时是DTO的库。无论如何,将这些类转移到单独的项目中的主要原因是最小化依赖关系,避免污染某些层

通常,我使用这些/项目: -域类和域服务的域逻辑-这里我还定义了接口,这些接口在服务层内实现 -DAL(实际上是一个ORM)-因此,由于映射(或者由于域类是实体),我们得到了对域类(项目)的依赖 -服务层-取决于上述两个项目 -演示(应用)层-引用所有项目的位置

大多数情况下,我有一个包含6-15个项目的解决方案:其中4个项目基于上述层,但我有其他项目,如域事件、域事件调度程序(针对项目中使用的给定DI)、特殊库,如HTML/PDF生成或电子邮件发送(带有自定义逻辑/模板)、HttpClient库(用于创建和设置处理程序链的空间库:自动登录、HTTP 401上的自动重试、某些错误或日志记录上的自动重试)

简而言之:正如您所看到的,我添加的大多数项目都有一个要实现的功能。它们不是基于类的。还有一个“受污染”的项目,有很多扩展类和实用类,我会尽力保持项目整洁