我无法找到有关此主题的信息,可能是因为我不确定如何表达该问题。希望这里的智囊团能够提供帮助或至少提供建议。这种情况可能只是我的内存力强,但它困扰着我,所以我想我应该寻求帮助来解决它。
我有一个 C# 库,其中包含其他程序集中使用的实用程序类。我的所有扩展都位于这个库中,它非常方便。我的任何其他库或需要使用这些类的可执行文件都必须自然引用该库。
但是我拥有的扩展之一是 Control 类的扩展,可以以一种不太复杂的方式处理跨线程控制更新。因此,实用程序库必须引用 System.Windows.Forms。
问题是引用实用程序库的任何库或可执行文件现在也必须具有对 System.Windows.Forms 的引用,否则我会因缺少引用而收到构建错误。虽然这不是什么大问题,但拥有与必须引用 System.Windows.Forms 的控件或表单无关的程序集似乎有点愚蠢,因为实用程序库尤其如此,因为它们中的大多数实际上并没有使用我编写的 InvokeAsRequired() 扩展。
我考虑过将 InvokeAsRequired() 扩展移到它自己的库中,这将消除 System.Windows.forms 问题,因为只有需要使用 InvokeAsRequired() 扩展的程序集才会引用 SWF...但这样我的图书馆里就只有一件东西,这可能会让我更烦恼。
除了分离出“有问题的”方法并创建一个几乎空的库之外,还有其他方法可以解决此要求吗?也许是编译设置什么的?
- 应该注意的是,“违规方法”实际上是在多个具有 UI 的项目中使用的。我所做的许多 UI 更新都是事件传入的结果,并且尝试从另一个线程更新 Windows 窗体控件会导致各种 UI 线程问题。因此,需要时处理调用的方法。 (尽管我个人认为整个 InvokeRequired 模式应该包含在控件本身中,而不是首先让外部的东西进行线程对齐)。
最佳答案
如果它只是一个函数,则将其作为源代码文件打包到 NuGet 包中,然后将 NuGet 包添加到您的项目中。然后,此代码将可以轻松部署到新项目(并且可以轻松更新),但您不需要创建单独的程序集。只需将其编译到您的应用程序中即可。
然后,您可以将 NuGet 包存储在本地 NuGet 存储库中,或者获取 myget 帐户,甚至只是将其存储在网络上的某个位置。最坏的情况,您可以将其 checkin 版本控制中,但我只会 checkin 您构建 nuget 包的“项目”,这样您就可以在需要时重建包。
谁知道,在某些时候,您可能会添加更多需要 Windows 窗体的实用函数,此时您就可以证明单独的程序集是合理的。
关于c# - 库需要引用 System.Windows.Forms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27724695/