【问题标题】:"Member 'HttpClient' is declared in another module and needs to be imported" in Mono.Cecil / FodyMono.Cecil / Fody中的“成员'HttpClient'在另一个模块中声明,需要导入”
【发布时间】:2016-06-25 22:20:59
【问题描述】:

感谢您抽出宝贵时间。

背景

我正在尝试在 Mono.Cecil 中创建一个新的 HttpClient,并将其添加到一个字段中。 这是我的代码:

TypeDefinition HttpClientDef = ModuleDefinition.GetType(typeof(HttpClient)).Resolve();
TypeDefinition def = GetSomeTypeDefinitionFromModule();

FieldDefinition field = new FieldDefinition($"${GENERATED_CLIENT_PATH}", FieldAttributes.Private, HttpClientDef);
def.Fields.Add(field);

这里没有问题,但是一旦void Execute()返回,就会抛出异常:成员'System.Net.Http.HttpClient'在另一个模块中声明,需要导入。。 p>

那又怎样?

我无法导入HttpClient。我尝试了很多事情,以下是我所知道的:

  • ModuleDefinition 没有 System.UriSystem.Net.Http.HttpClient 的定义,例如。
  • 但是,我可以通过以下方式获得对 HttpClient 的引用:

    AssemblyDefinition httpAssembly = AssemblyResolver.Resolve("System.Net.Http");
    TypeDefinition HttpClientDef = httpAssembly.MainModule.GetType(typeof(HttpClient)); // fyi, HttpClient is also in httpAssembly.GetTypes().
    
  • 一旦我有了一个有效的TypeDefinition,我就不知道该怎么办了。

    • ModuleDefinition.Import(def).Resolve() 不会改变任何东西;
    • new TypeReference(namespace, name, ModuleDefinition, httpAssembly.Name) 也不起作用;
    • 也不直接调用def

有什么想法吗?

谢谢你,
格雷格。


编辑 1

如果代码中未使用类型的引用(在本例中为 System.Net.Http),则无法导入类型。
现在,我可以使用TypeDefinition def = ModuleDefinition.GetType(typeof(HttpClient)) 加载它。

【问题讨论】:

  • 您使用的是哪个版本的 Mono.Cecil?在我的版本中,ModuleDefinition.Import(...)(所有重载)被标记为已过时,替换为ImportReference(...)
  • 我的版本没有标记为过时的 Import 方法,尽管我确实看到了有关此的博客文章。你也是从 Nuget 得到的,还是编译的?

标签: c# exception mono mono.cecil fody


【解决方案1】:

创建新的FieldDefinition 只需要TypeReference 而不是TypeDefinition,因此无需调用Resolve()。试试这个:

FieldDefinition field = 
    new FieldDefinition($"${GENERATED_CLIENT_PATH}",
    FieldAttributes.Private, 
    moduleDefn.Import(typeof(HttpClient));

【讨论】:

    【解决方案2】:

    由于某种原因,SystemSystem.Net.Http 没有被引用,即使我已将它们添加为引用。在我的(修改后的)代码中显式使用HttpClient 一次会强制引用存在,之后我就能够Import 它。

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多