"Member 'HttpClient' is declared in another module and needs to be imported" 在 Mono.Cecil / 福迪
"Member 'HttpClient' is declared in another module and needs to be imported" in Mono.Cecil / Fody
谢谢你给我时间。
背景
我正在尝试在 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'在另一个模块中声明,需要导入 .
那又怎样?
我无法导入 HttpClient
。我已经尝试了很多东西,以下是我所知道的:
例如,- ModuleDefinition 没有
System.Uri
或 System.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))
.
加载它
创建一个新的 FieldDefinition
只需要 TypeReference
而不是 TypeDefinition
,因此不需要调用 Resolve()
。试试这个:
FieldDefinition field =
new FieldDefinition($"${GENERATED_CLIENT_PATH}",
FieldAttributes.Private,
moduleDefn.Import(typeof(HttpClient));
出于某种原因,System
和 System.Net.Http
没有被引用,即使我添加了它们作为引用。在我的(修改后的)代码中显式使用 HttpClient
一次强制引用存在,之后我能够 Import
它。
谢谢你给我时间。
背景
我正在尝试在 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'在另一个模块中声明,需要导入 .
那又怎样?
我无法导入 HttpClient
。我已经尝试了很多东西,以下是我所知道的:
-
例如,
- ModuleDefinition 没有
System.Uri
或System.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))
.
创建一个新的 FieldDefinition
只需要 TypeReference
而不是 TypeDefinition
,因此不需要调用 Resolve()
。试试这个:
FieldDefinition field =
new FieldDefinition($"${GENERATED_CLIENT_PATH}",
FieldAttributes.Private,
moduleDefn.Import(typeof(HttpClient));
出于某种原因,System
和 System.Net.Http
没有被引用,即使我添加了它们作为引用。在我的(修改后的)代码中显式使用 HttpClient
一次强制引用存在,之后我能够 Import
它。