如果您想通过类型转发将类引用转发到另一个程序集,该类是否需要从 Type 继承?
我想我真正追求的是 - 在类型转发的短语和概念中,“类型”一词是什么意思,或者表示什么。
如果您想通过类型转发将类引用转发到另一个程序集,该类是否需要从 Type 继承?
我想我真正追求的是 - 在类型转发的短语和概念中,“类型”一词是什么意思,或者表示什么。
如果您想通过类型转发将类引用转发到另一个程序集,该类是否需要从 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 的元数据表的部分。
这是一个有点令人困惑的话题,所以这里有一个分步示例 - 现在使用 Eric 答案中的名称来帮助保持一致。我们将从一个库 (Alpha.dll) 开始并构建一个依赖于 Alpha 的应用程序 (Test.exe)。然后我们将 Test.exe 所依赖的类型 (Foo) 放入不同的库 (Bravo.dll) 中,而无需重新编译 Test.exe。
创建以下文件:
Foo.cs
using System;
public class Foo
{
public static void Report()
{
Console.WriteLine("Foo.Report");
}
}
测试.cs
class Test
{
static void Main()
{
Foo.Report();
}
}
构建 Alpha.dll:
csc /target:library /out:Alpha.dll Foo.cs
构建测试.exe
csc /r:Alpha.dll Test.cs
运行 Test.exe - 你应该得到明显的输出
构建 Bravo.dll:
csc /target:library /out:Bravo.dll Foo.cs
创建一个新文件Forwarding.cs:
using System.Runtime.CompilerServices;
[assembly:TypeForwardedTo(typeof(Foo))]
重新编译 Alpha.dll:
csc /r:Bravo.dll /target:library /out:Alpha.dll Forwarding.cs
请注意我们如何不再在 Alpha 中包含 Foo 的代码。
运行 Test.exe - 它仍然可以工作,尽管 Test.exe要求在 Alpha.dll 中引用 Foo……CLR 只是将其重定向到 Bravo.dll。
如果您查看 Test.exe,它仍将引用 Alpha。如果你查看 Alpha.dll,你会发现 Foo 类型的代码已经不存在了……只是通过类型转发,它们都挂在一起了。