我正在使用 Reflection.Emit 即时生成一个程序集,然后保存它。它包含一个 Type 和一个静态 Main() 方法。
.NET 可以自动引用所需的程序集。但是,在 Main() 中,调用了来自另一个程序集的方法,并且没有以标准方式引用它。
执行程序集时,运行时查找此程序集但找不到它,这是一个问题。
Reflector 可以检测到这一点,并在“依赖”列表下显示这个额外的程序集。如何使用反射 API 检索这些隐式依赖项?
谢谢
我正在使用 Reflection.Emit 即时生成一个程序集,然后保存它。它包含一个 Type 和一个静态 Main() 方法。
.NET 可以自动引用所需的程序集。但是,在 Main() 中,调用了来自另一个程序集的方法,并且没有以标准方式引用它。
执行程序集时,运行时查找此程序集但找不到它,这是一个问题。
Reflector 可以检测到这一点,并在“依赖”列表下显示这个额外的程序集。如何使用反射 API 检索这些隐式依赖项?
谢谢
谢谢大家的回复,我已经解决了这个问题。
这是发生的事情:
AssemblyBuilder builder = ... // 生成程序集
builder.GetReferencedAssemblies(); => 即使我已经调用了 Save(),它也不会返回对方法体中使用的程序集的引用——它似乎只返回已经加载到内存中的程序集。
Assembly.ReflectionOnlyLoadFrom(filename).GetReferencedAssemblies() => 工作正常
您是否尝试过 Assembly.GetReferencedAssemblies?它返回被引用程序集的 AssemblyName。
嗯... Assembly
System.Type 的属性显然返回定义类型的程序集。
如果您对该 Main() 方法中的 IL 完全没有控制/知识,则必须解析刚刚生成的 IL 并检查是否存在所有提到的类型。
更现实的是,手动确保调用和 callvirt 发射所涉及的所有类型都被引用。