Используйте ActiveX в С#

У меня есть такой код javascript:

  o = new ActiveXObject("ASDFsome.Application");
  utilites = WScript.CreateObject("ASDF.Utilites.UTF.Converter")
  utilites.Convert(outFile, xmlProp.xml)

Теперь я хочу переписать его в коде С#. Как мне использовать ActiveXObject в сети?


person RomanKovalev    schedule 11.10.2012    source источник


Ответы (2)


Не в последнюю очередь поэтому ключевое слово dynamic было добавлено в C# версии 4:

dynamic utilites = Activator.CreateInstance(Type.GetTypeFromProgID("ASDF.Utilites.UTF.Converter"));
utilites.Convert(outFile, xmlProp.xml);

Если вы застряли на более ранней версии, лучшим подходом будет использование библиотеки классов VB.NET. Он напрямую поддерживает функцию CreateObject(), используемую в вашем коде сценария.

И последнее, но не менее важное: в отличие от языка сценариев, который вы использовали, и C#, и VB.NET поддерживают раннее связывание. Это начинается с добавления ссылки на библиотеку типов, Project + Add Reference и использования вкладки COM или вкладки Browse для выбора файла .tlb или .dll, содержащего библиотеку типов. У вас может не быть его, если компонент был разработан для использования только из языков сценариев с поздней привязкой. Иначе мы не сможем помочь вам найти правильную библиотеку типов, о которой будет знать поставщик или автор.

И последнее, но не менее важное: это похоже на утилиту, которая умеет читать XML-файл в кодировке utf-8. Это уже очень хорошо поддерживается в .NET с пространством имен System.Xml.

person Hans Passant    schedule 11.10.2012
comment
Хорошо, я ошибаюсь насчет C#. Мой проект, где мне нужно использовать эти функции в F #. Извините за ошибку. И там у меня нет динамического ключевого слова. Должен ли я использовать второе мышление? - person RomanKovalev; 12.10.2012
comment
Эм, да, подумай об этом. Написать этот код на C# или VB.NET, а затем использовать его на F#, конечно, тоже хорошая идея. - person Hans Passant; 12.10.2012
comment
Есть ли способ проверить, зарегистрирован ли и доступен ли ActiveX с конкретным progId, перед вызовом экземпляра создания? - person MGR; 23.09.2015

Одна из возможностей - использовать Reflection:

var utilitiesType = Type.GetTypeFromProgID("ASDF.Utilites.UTF.Converter");
var instance = Activator.CreateInstance(utilitiesType);
utilitiesType.InvokeMember(
    "Convert", 
    BindingFlags.InvokeMethod | BindingFlags.Public, 
    null, 
    instance, 
    new[] { "outputFile", "xmlProp.xml" }
);

Другой возможностью является создание строго типизированного прокси для COM-объекта. Щелкните правой кнопкой мыши свой проект, добавьте ссылку -> вкладка COM -> выберите объект COM в списке или загрузите его из DLL. Затем Visual Studio создаст строго типизированную обернутую сборку для этого COM-объекта и автоматически добавит ее в качестве ссылки. Далее вы можете работать с COM-объектом напрямую, сохраняя его строгую типизацию.

person Darin Dimitrov    schedule 11.10.2012