c# 通过泛型构造循环引用
c# struct cycled reference via generic
定义结构时,很明显结构字段的值不能是结构本身。此外,当定义 2 个结构并且每个结构都有另一个字段类型时,问题实际上是相同的。
但是,当不是直接设置类型而是对该类型使用泛型时,为什么这仍然是一个问题?
public struct Generic<T> { }
public struct Test1
{
Generic<Test2> f;
}
public struct Test2
{
Generic<Test1> f;
}
这段代码可以很好地编译并生成一个 dll。当我尝试加载 dll 时,我得到 'Unable to load one or more of the requested types..' 并仅列出具有上述关系的那些类型。如果我只删除其中一个字段,则加载成功。这是怎么回事以及如何解决这个问题?
我也注意到只要我有这个循环泛型类型,dotnet test explorer 就找不到任何测试,但我认为这是同样的问题。
编辑:
以上代码可以编译成.dll文件。然后,从另一个项目我使用 System.Runtime.Loader 动态加载 dll:
public static void Main(string[] args)
{
var context = new AssemblyLoadContext("context");
Assembly assembly = context.LoadFromAssemblyPath("path-to-dll");
Type[] types = assembly.GetTypes();
}
在示例的最后一行,我得到了 ReflectionTypeLoadException。
我同意,这应该行得通。但事实并非如此。这是关于运行时如何加载类型的 known issue。
解决这个问题显然需要重写类型加载方式的核心实现。导致可能影响大部分现有程序的行为发生重大变化。到目前为止,解决此问题的成本被认为太高,不值得这样做。
定义结构时,很明显结构字段的值不能是结构本身。此外,当定义 2 个结构并且每个结构都有另一个字段类型时,问题实际上是相同的。
但是,当不是直接设置类型而是对该类型使用泛型时,为什么这仍然是一个问题?
public struct Generic<T> { }
public struct Test1
{
Generic<Test2> f;
}
public struct Test2
{
Generic<Test1> f;
}
这段代码可以很好地编译并生成一个 dll。当我尝试加载 dll 时,我得到 'Unable to load one or more of the requested types..' 并仅列出具有上述关系的那些类型。如果我只删除其中一个字段,则加载成功。这是怎么回事以及如何解决这个问题?
我也注意到只要我有这个循环泛型类型,dotnet test explorer 就找不到任何测试,但我认为这是同样的问题。
编辑:
以上代码可以编译成.dll文件。然后,从另一个项目我使用 System.Runtime.Loader 动态加载 dll:
public static void Main(string[] args)
{
var context = new AssemblyLoadContext("context");
Assembly assembly = context.LoadFromAssemblyPath("path-to-dll");
Type[] types = assembly.GetTypes();
}
在示例的最后一行,我得到了 ReflectionTypeLoadException。
我同意,这应该行得通。但事实并非如此。这是关于运行时如何加载类型的 known issue。
解决这个问题显然需要重写类型加载方式的核心实现。导致可能影响大部分现有程序的行为发生重大变化。到目前为止,解决此问题的成本被认为太高,不值得这样做。