Член «HttpClient» объявлен в другом модуле и должен быть импортирован в Mono.Cecil/Fody.

и спасибо, что уделили мне свое время.

Фон

Я пытаюсь создать новый HttpClient в Mono.Cecil и добавить его в поле. Вот мой код:

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() does not change anything ;
    • new TypeReference(namespace, name, ModuleDefinition, httpAssembly.Name) тоже не работает;
    • Также не вызывает def напрямую.

Есть идеи?

Спасибо,
Грег.


Изменить 1

Оказывается, вы не можете импортировать тип, если его ссылка (в данном случае System.Net.Http) не используется в коде.
Теперь я могу загрузить его, используя TypeDefinition def = ModuleDefinition.GetType(typeof(HttpClient)).


person Greg    schedule 23.06.2016    source источник
comment
Какую версию Mono.Cecil вы используете? В моей версии ModuleDefinition.Import(...) (все перегрузки) помечен как устаревший, заменен на ImportReference(...).   -  person Mr Anderson    schedule 25.06.2016
comment
В моей версии метод Import не помечен как устаревший, хотя я видел сообщение в блоге об этом. Вы также получили его из Nuget или скомпилировали?   -  person Greg    schedule 25.06.2016


Ответы (2)


Для создания нового FieldDefinition требуется только TypeReference, а не TypeDefinition, поэтому нет необходимости вызывать Resolve(). Попробуй это:

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

По какой-то причине System и System.Net.Http не упоминались, хотя я добавил их в качестве ссылок. Явное использование HttpClient однажды в моем (измененном) коде заставило ссылку существовать, и после этого я смог Import ее.

person Greg    schedule 25.06.2016