3

如果您想通过类型转发将类引用转发到另一个程序集,该类是否需要从 Type 继承?

我想我真正追求的是 - 在类型转发的短语和概念中,“类型”一词是什么意思,或者表示什么。

4

2 回答 2

14

如果您想通过类型转发将类引用转发到另一个程序集,该类是否需要从 Type 继承?

不。

我想我真正追求的是 - 在类型转发的短语和概念中,“类型”一词是什么意思,或者表示什么。

假设您在汇编 Alpha 中有一个 Foo 类型,并且在您的下一个版本中,您意识到 Foo 确实应该在汇编 Bravo 中。您不能移动该类型,因为所有依赖 Foo 处于 Alpha 中的客户都将被破坏。

解决方案是将类型 Foo 移动到 Bravo 中,然后发布一个新版本的 Alpha,其中包含一个类型转发器,告诉 Alpha 的用户“如果你正在寻找 Foo,它现在可以在 Bravo 中找到”。这样一来,您就不会破坏任何依赖于过去的事物的人。

我认为我在这里缺少的是“类型”的定义在类型转发的概念中。什么是类型?

以下是类型定义

  • 非泛型或非构造泛型类、结构、接口和委托
  • 枚举

以下是类型引用(它们都引用另一种类型;这些都没有定义新的东西。)

  • 构造的泛型类、结构、接口和委托
  • 数组
  • 指针
  • 可空值

(并且有一种类型不属于任一类别,即返回类型“void”。)

在所有这些类型中,只有类型定义可以被转发。类型转发器的目的是说“以前由该程序集定义的类型现在由该程序集定义”,因此仅转发类型定义才有意义。你不能转发类型MyStruct<int>[];这没有任何意义。你可以转发MyStruct<T>

“未构造的泛型类是什么意思?这是否仅意味着泛型的定义,而不是已使用指定类型实例化的泛型?

正确的。

你能指出我在哪里找到“类型引用”和“类型定义”的信息吗?

这些不是 C# 语言规范中的概念;相反,这些是来自底层公共语言基础结构类型系统的概念。有关 CLI 在定义类型和引用类型之间的差异的广泛技术性研究,请阅读 ECMA 335 CLI 规范,特别是查找有关 TypeDef 和 TypeRef 的元数据表的部分。

于 2011-01-08T20:14:29.930 回答
10

这是一个有点令人困惑的话题,所以这里有一个分步示例 - 现在使用 Eric 答案中的名称来帮助保持一致。我们将从一个库 (Alpha.dll) 开始并构建一个依赖于 Alpha 的应用程序 (Test.exe)。然后我们将 Test.exe 所依赖的类型 (Foo) 放入不同的库 (Bravo.dll) 中,而无需重新编译 Test.exe。

  1. 创建以下文件:

    Foo.cs

    using System;
    
    public class Foo
    {
        public static void Report()
        {
            Console.WriteLine("Foo.Report");
        }
    }
    

    测试.cs

    class Test
    {
        static void Main()
        {
            Foo.Report();
        }
    }
    
  2. 构建 Alpha.dll:

    csc /target:library /out:Alpha.dll Foo.cs
    
  3. 构建测试.exe

    csc /r:Alpha.dll Test.cs
    
  4. 运行 Test.exe - 你应该得到明显的输出

  5. 构建 Bravo.dll:

    csc /target:library /out:Bravo.dll Foo.cs
    
  6. 创建一个新文件Forwarding.cs

    using System.Runtime.CompilerServices;
    [assembly:TypeForwardedTo(typeof(Foo))]
    
  7. 重新编译 Alpha.dll:

    csc /r:Bravo.dll /target:library /out:Alpha.dll Forwarding.cs
    

    请注意我们如何不再在 Alpha 中包含 Foo 的代码。

  8. 运行 Test.exe - 它仍然可以工作,尽管 Test.exe要求在 Alpha.dll 中引用 Foo……CLR 只是将其重定向到 Bravo.dll。

    如果您查看 Test.exe,它仍将引用 Alpha。如果你查看 Alpha.dll,你会发现 Foo 类型的代码已经不存在了……只是通过类型转发,它们都挂在一起了。

于 2011-01-08T20:27:04.843 回答