在C#项目中引用一个exe文件是不好的做法

我有一个简单的问题。

我知道我可以在C#项目中引用.net可执行文件。

我不想使用“输出类型:Windows应用程序”进行不必要的项目来调用某些DLL。

我只是想知道这是可以的,还是拒绝一个exe文件是不好的做法?

是的,这可以被看作是一个不好的做法,原因如下:

>错误的项目架构
如果您需要从.exe调用一些逻辑,那么该逻辑不正确地放在那里。相反,您应该将它放在单独的dll中,并引用当前引用的可执行文件以及引用可执行文件的应用程序的相同.dll。
comments below中所述,将逻辑提取到库中可以帮助您避免一些CPU架构限制,我将在下一节中介绍,因为可以构建库来定位任何CPU。
>建筑局限性
引用的可执行文件可能已经被构建来解决最佳的32位或64位机器,甚至特定的CPU(如安腾)。一个图书馆可以在没有这些规范的情况下构建,以便与跨CPU兼容,因此以后可以被任何项目引用。如果引用具有特定架构设置的可执行文件,则应该使用兼容的设置来引用项目。我认为是限制。
>潜在的许可问题
您应该仔细分发您的申请。如果引用的可执行文件需要额外的许可证或费用才能使用,您将必须强制用户接受该应用程序的可执行文件许可证(如果需要的话),否则可能会发生非法分发它与您的软件。这也意味着您有权首先引用可执行文件。
>未知的后果
该可执行文件将被复制到bin文件夹中并与您的应用程序一起安装。没有人知道如果有人浏览bin文件夹并执行它,会发生什么。有一些问题:

>可执行文件因为输入不正确而崩溃或行为不端。通常情况下,如果没有任何GUI(例如,如果命令行程序被用户双击,它将不会以命令行参数的形式获得任何输入,从而崩溃或行为不当)。
>可执行程序不是由程序的所有者使用,因为这与您的软件有法律或逻辑上的矛盾。

然而,在某些情况下,引用可执行文件可能是合理的,但这些是不够的:

>可执行文件来自第三方,不存在具有相同功能的库,而没有其他方法链接到该功能。您的雇主或客户所建立的项目也可能是明确的要求。
>可执行文件用另一种语言编写,您需要通过互操作与之通信。

只要后者不适用于你,特别是如果你开发出自己引用的可执行文件,我一定会推荐将所需的逻辑提取到单独的库中。

1实际上,如Dominic Kexel’s comment所述,您还可以构建一个可执行文件来定位任何CPU。相反的情况也是可能的 – 为特定的CPU构建库,但不常见,因为可执行文件通常是针对硬件。
所以,为了澄清我的观点,我考虑到引用第三方可执行文件,或者由于其他原因而无法重建的可执行文件,并且该可执行文件已经针对某些特定的架构进行了优化。如果您可以重建和更改可执行文件的目标CPU,那么您可以将所需的逻辑提取到dll中。

翻译自:https://stackoverflow.com/questions/22835635/is-it-a-bad-practice-to-reference-an-exe-file-in-c-sharp-project

转载注明原文:在C#项目中引用一个exe文件是不好的做法