gpt4 book ai didi

c# - 找到类型实现所需的所有程序集以成功编译

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:59 26 4
gpt4 key购买 nike

使类型的实现(.cs 源文件)成功编译所需的所有程序集的反射方法是什么?

假设您的源文件仅包含此类型的实现(没有其他实现)。

例如

程序集 MyAssembly.dll 声明了这个接口(interface)

public interface IInterface { byte[] Array { get; } }

Assembly MyAssembly2.dll 声明了这个抽象类

public abstract class MyTypeBase: IInterface
{
public byte[] Array { get; set; }
protected virtual void Execute(ConfigurationManager cmgr) { }
}

在源文件“MyType.cs”中有 MyType 的实现

public class MyType<T>: MyTypeBase
{
protected override void Execute(ConfigurationManager cmgr)
{
Array = new Byte[512];
}

public List<T> Data { get; set; }
}

然后,对于类型 MyType<DateTime>需要引用的程序集是:

  • mscorlib (因为 DateTime, Byte, Byte[], List<DateTime> )
  • MyAssembly2.dll (因为 MyTypeBase )
  • MyAssembly.dll (因为 IInterfaceMyTypeBase 间接引用)
  • System.Configuration (因为 ConfigurationManager )

这个要用到动态编译的场景,不知道要找多深,在哪里找某个类型引用的Type(该类型的实现接口(interface),继承类,返回类型,方法参数、事件等)

例如,上面的例子是否有必要引用MyAssembly.dll因为它被 MyType<DateTime> 间接而非直接引用?

更新:

正如我所说,这将在动态编译场景中使用,但我忘了提到没有要编译的源文件,而是一个 CodeDOM CompilationUnit。因此初始类型中的每个引用类型都是众所周知的(通过反射)。

我想要的只是,对于运行时的给定类型实例,如果我必须编译此类型的源代码,则找到所有需要作为引用的程序集。

最佳答案

您要求的内容与 C# 语言的工作方式不一致。

据我所知,没有办法看到 token Byte 并明确知道调用者指的是来自 mscorlibSystem.Byte。他们可能意味着来自他们自己的命名空间的他们自己的 Byte 实现,甚至是来自他们自己的命名空间的 System.Byte 实现。

这就是为什么作为应用程序开发人员,您需要指明要引用的库,然后删除任何不明确的引用。


如果您想查看类型接口(interface)所需的类型,您可以使用反射遍历该类型的所有公共(public)(和 protected )成员,并查看它们接受哪些类型作为参数并返回。

您还必须查看所有引用类型的基类型和接口(interface),它们也可以在单独的程序集中声明。

每个 Type 实例都公开一个 Assembly您可以使用该属性来定位加载该类型的 AppDomain 在其中找到该类型的程序集。这可能足以满足您的目的。

关于c# - 找到类型实现所需的所有程序集以成功编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com