Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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#_C# 4.0_Reference - Fatal编程技术网

C# 有没有办法防止项目中包含某些引用?

C# 有没有办法防止项目中包含某些引用?,c#,c#-4.0,reference,C#,C# 4.0,Reference,基本上我想做一些预防性维护。我想防止某些第三方库作为参考包含在某个项目中。您有没有办法指定项目禁止哪些引用 编辑:我会澄清一下目的。我想保护的项目是一个类库,我想从一组非常特定的第三方库中获得功能。类库在其他解决方案中用于公共数据访问功能,因此如果引用了这些第三方库,也需要它们。其目的是保持一个项目只是一个数据访问库,并保持“包”的轻量级 编辑2:不知道为什么投票被否决了。出于是否可以完成这类工作的兴趣,提出了一个问题。搜索允许的程序集并标记异常可能更实际,因为有人可以简单地将恶意程序集重命名为

基本上我想做一些预防性维护。我想防止某些第三方库作为参考包含在某个项目中。您有没有办法指定项目禁止哪些引用

编辑:我会澄清一下目的。我想保护的项目是一个类库,我想从一组非常特定的第三方库中获得功能。类库在其他解决方案中用于公共数据访问功能,因此如果引用了这些第三方库,也需要它们。其目的是保持一个项目只是一个数据访问库,并保持“包”的轻量级


编辑2:不知道为什么投票被否决了。出于是否可以完成这类工作的兴趣,提出了一个问题。

搜索允许的程序集并标记异常可能更实际,因为有人可以简单地将恶意程序集重命名为不在列表中的名称并逃避检测

用于构建程序集的.csproj文件是普通的XML文件,因此可以使用XPath语句轻松定位引用的程序集,其中谓词是允许的程序集名称。您可以设置一个触发器,每当.csproj文件签入到源存储库时,该文件都会被扫描,并且任何罪魁祸首程序集都会被标记

使用这种方法,或者任何类似的方法,都有可能邀请流氓开发者玩一个蛙跳游戏。你很可能会输掉这场游戏,因为开发者都是优秀的蛙跳玩家。因此,更可靠的方法是减少对技术的依赖,更多地依赖于管理资源计划。

您可以使用来实现这一点(假设您拥有Visual Studio Ultimate)。绘制一个代表您的项目的框/层,然后将您的项目放到该框/层上以链接它们,绘制一个代表禁止的程序集的框/层,然后将这些程序集放到该框/层上以链接它们,然后完成(通过在层之间不绘制依赖项箭头,您向VS指示不允许依赖项)


现在,通过设置MSBuild属性,在项目和/或TFS构建中启用层图验证:validateAructural=True

尽管有反对票,但我发现这是一个合理的问题。我在一个大型开发团队中工作,所有人都在使用同一个软件,并且有类似的问题

我们在一个大型领域驱动的设计架构中工作,该架构具有许多不同的有界上下文,不希望人们在上下文之间添加引用。 我们有指导方针、标准、体系结构文档、代码审查等等,很多东西都阻止引用被添加到IRL中(正如有人所说)。然而,我们有两个相对较新的先发球员,他们对目前的结构没有太多经验,只是不能神奇地了解一切。他们碰巧互相检查了代码,瞧,添加了不需要的引用

我认为,在努力防止错误发生和确保标准得到遵守方面,没有任何严厉的做法。只是预防措施。这不是我们编写单元测试的部分原因吗?让未来的其他新人意识到他们在不知不觉中弄坏了什么

我并不特别喜欢分析项目文件中的参考资料。我们处理它的方式可能是定义一组单元测试,这些单元测试在每个被测试项目的程序集引用中爬行,当它们识别出不应该存在的引用时失败。 显然,只有在持续集成/部署(包括运行单元测试)的情况下,这才有效


因此,即使新成员在没有首先在本地运行单元测试(并意识到他们的错误)的情况下签入一些东西,我们亮红色闪烁的构建状态灯或构建服务器电子邮件将很快告诉团队中的每个人出了什么问题。

这绝对是一个有效的问题,Ben的回答非常准确。但是,此工具有助于自动执行引用约束:

编写一个扩展,用于检查所有规则,并将此分析器放入解决方案中。您的分析将作为汇编的一部分


这与NsDepCop的基本工作原理非常相似。

我想你的意思不仅仅是“删除引用”,而是“防止它们被重新添加”?你那些给禁止项目添加引用的流氓同事是谁?您可能应该在不采取像这样严厉措施的情况下解决这个IRL。强制性的代码审查会有所帮助。是的。从开发人员使用的所有计算机中删除第三方库,并且首先不允许添加这些库。除此之外,没有。他们是开发人员,所以他们可以访问源代码,还记得吗?@KirkWoll在自动化的情况下依靠人来强制实施架构约束,这听起来很严厉。培训和审查当然会在第一时间起到帮助作用,但错误不可避免地会发生。事实上,从技术上讲,这不会阻止他们添加引用,但会阻止他们使用该引用。有趣的想法。感谢您的回复。在这种情况下,我关心的DLL是特定的第三方库,因此有一个固定的列表。我以前没有听说过这个工具-我已经安装并在5分钟内工作,好建议!本,我本来很想对这个答案投赞成票,但到最后我意识到它实际上并没有提供一个解决方案。如果在这五年中,你实现了一些东西,请发布一些代码!