是否可以使用指令指定程序集范围?

Is it possible to specify an assembly scoped using directive?

我在一个程序集中有几个 string 扩展方法 A。在程序集 B 中,我无法使用这些扩展方法,除非我在程序集 B 中的每个 .cs 文件中添加一个 using A 指令。 有没有办法在 B 程序集项目配置中为整个程序集指定一个 using ?类似于 c++ stdafx.h

谢谢

using 将命名空间导入当前上下文以避免通过完全限定名称引用 类 和其他其他结构。

您可以(但不是一个好主意)将所有结构放在程序集 B 的一个名称空间中,因此您只需要一个 using。坏主意是因为代码组织不好等

根据您的程序集 B 包含的内容,您的字符串扩展函数可能会放在同一个命名空间中(而模型等其他东西则放在单独的命名空间中)。这似乎是一个体面的组织。

请注意,所有这些扩展函数都可以在单独的 .cs 文件中,并且仍然在同一个命名空间中,因此需要一个 using 声明来导入它们。

例如

ExtensionA.cs

namespace AssemblyB.Strings.Extensions
{
    public static string ExtensionA(this string source, ...) {...}
}

ExtensionB.cs

namespace AssemblyB.Strings.Extensions
{
    public static string ExtensionB(this string source, ...) {...}
}

ExtensionC.cs

namespace AssemblyB.Strings.Extensions
{
    public static string ExtensionC(this string source, ...) {...}
}

AssemblyA.cs

using AssemblyBStrings.Extensions;

    ...
    var b = "Hello World".ExtensionA().ExtensionB().ExtensionC();

否,暂无此功能

查看 assembly/project 级别支持哪些功能的一个有用方法是查看命令行编译器的帮助。

Visual Basic 使用 Import 语句的方式与 C# 具有 using 指令的方式相同,并且具有 Project Imports 的概念。事实上,当我们查看 vbc /? 的输出时,我们可以看到:

                                  - LANGUAGE -

/define:<symbol_list>             Declare global conditional compilation
                                  symbol(s). symbol_list:name=value,...
                                  (Short form: /d)
/imports:<import_list>            Declare global Imports for namespaces in
                                  referenced metadata files.
                                  import_list:namespace,...
/langversion:<number>             Specify language version:
                                  9|9.0|10|10.0|11|11.0|12|12.0|14|14.0
/optionexplicit[+|-]              Require explicit declaration of variables.
/optioninfer[+|-]                 Allow type inference of variables.
/rootnamespace:<string>           Specifies the root Namespace for all type
                                  declarations.
/optionstrict[+|-]                Enforce strict language semantics.
/optionstrict:custom              Warn when strict language semantics are not
                                  respected.
/optioncompare:binary             Specifies binary-style string comparisons.
                                  This is the default.
/optioncompare:text               Specifies text-style string comparisons.

而且我们可以看到有/imports选项。

如果我们查看 csc /? 的等效部分,我们会看到:

                        - LANGUAGE -
 /checked[+|-]                 Generate overflow checks
 /unsafe[+|-]                  Allow 'unsafe' code
 /define:<symbol list>         Define conditional compilation symbol(s) (Short
                               form: /d)
 /langversion:<string>         Specify language version mode: ISO-1, ISO-2, 3,
                               4, 5, 6, or Default

而且我们可以看到没有等价物 /using//usings。由此,我们可以推断,在编译程序集时,无法通知 C# 编译器一组 using 指令应用于每个文件。

using 包括一个 命名空间 ,而不是程序集。命名空间不必与其程序集同名(即使这是一个通用约定)。

如果您自然而然地希望在所有程序集中包含您的字符串扩展,因为它们代表通用功能,那么只需将它们放在顶级名称空间中,例如MyCompanyName.MyApplication。然后,它们在同一名称空间或子名称空间中的任何其他 class 的范围内。

(这确实假设您的所有名称空间都遵循从共同根下降的常见做法,例如 MyCompanyName...。)