Используя COM dll от C# без библиотеки типов

Улучшая ответ Винсента, я написал скрипт для этого: xcodearchive
Он позволяет вам архивировать (генерировать ipa) ваш проект через командную строку. Думайте об этом как о сестре команды xcodebuild, но для архивации.

Код доступен на github: http://github.com/gcerquant/xcodearchive


Один из вариантов сценария - включить архивирование Символы dSYM в архиве с метками времени. Нет оправдания тому, чтобы больше не хранить символы и не иметь возможности символизировать журнал аварийного сбоя, который вы можете получить позже.

11
задан toxvaerd 29 June 2009 в 13:42
поделиться

7 ответов

Вам просто нужен CLS_ID и идентификатор интерфейса. Я написал об этой конкретной проблеме в своем блоге:

« Использование Obscure Windows COM API в .NET »

12
ответ дан 3 December 2019 в 06:22
поделиться

Напишите обертку на VB.Net. VB.Net поддерживает истинное позднее связывание (без беспорядочного отражения). Все, что вам нужно, это прогид. Вы также должны реализовать IDisposable для явного управления жизненным циклом компонента.

2
ответ дан 3 December 2019 в 06:22
поделиться

Довольно часто вы встретите реализацию интерфейса, которая не поддерживается библиотекой типов (Delphi или иначе). Расширения оболочки - один из примеров.

По сути, вам нужно сделать вызов Windows API для создания экземпляра через соответствующие вызовы функций COM. API позаботится об управлении DLL через экспортированные функции, о которых вы упомянули ранее.

Вам нужно будет воссоздать определение интерфейса в коде C #, но после этого вы просто создаете объект, приведете его к интерфейсу, и это не отличается от всего остального. Единственное реальное предостережение: в зависимости от вашего использования могут возникнуть некоторые проблемы с потоками, с которыми нужно справиться, поэтому проверьте «модель потоков», которая использовалась для DLL, и рассмотрите свое использование на основе этого. Учебник

2
ответ дан 3 December 2019 в 06:22
поделиться

Да и нет.

Все, что нужно C # (и любой язык CLR) для взаимодействия с COM-объектом, является совместимым интерфейсом. подпись. Обычно указывается методы, GUID и стиль квартиры интерфейса. Если вы можете добавить это определение в свою базу кода, тогда в TLB нет необходимости.

В этом утверждении есть небольшая оговорка. Я думаю, вы это сделаете. попадете в неприятности, если попытаетесь использовать COM-объект за пределами квартиры и не зарегистрировали подходящий TLB. Однако я не могу на 100% вспомнить этот момент.

1
ответ дан 3 December 2019 в 06:22
поделиться

Это зависит от того, для какого контента вы хотите создать подпапку / -домены.

Связано ли это с вашим исходным сайтом? Тогда вам обязательно следует использовать подпапку, поскольку она принадлежит к тому же домену. Если вы используете подпапки, то гораздо лучше, чтобы ссылочная масса распространялась.

Что касается PageRank, лучше использовать подпапки.

Поддомены считаются новым сайтом. Подпапки - нет, и они получат более высокий рейтинг, если ваш исходный сайт является мощным.

Вы можете использовать как поддомены, так и подпапки, если хотите, но не забудьте использовать канонический тег, чтобы избежать дублирования контента.

Два соответствующие ссылки, которые объясняют это дальше:

http://www.searchmarketingstandard.com/when-to-use-subdomains-vs-subfolders http: //www.searchenginejournal.

1
ответ дан 3 December 2019 в 06:22
поделиться

Я подозреваю, что ключевое слово dynamic (C # 4.0) выполнит это. Если это так, это даст результаты, которые в значительной степени эквивалентны вызову методов, то есть так, как предлагает Groo.

0
ответ дан 3 December 2019 в 06:22
поделиться

Если вам удалось создать экземпляр объекта, вы преодолели первое серьезное препятствие!

Теперь попробуйте следующее:

myObject.GetType().InvokeMember(
                      "ResObjOpen",  // method name goes here
                      BindingFlags.InvokeMethod,
                      null,
                      myObject,
                      new object[] { 
                         someClientID,   // arguments go here
                         someSubId, 
                         somFileName, 
                         someInt} );

Я думаю, что вам может понадобиться сделайте это, если COM-объект Delphi не является «двойным» объектом. Он может поддерживать только позднее связывание, т. Е. Вид вызова, который вы видите выше.

(В C # 4.0 они упрощают эту задачу с помощью ключевого слова dynamic .)

EDIT: Just заметил кое-что очень подозрительное. IID для интерфейса и CLSID для самого объекта кажутся одинаковыми. Это неправильно.

Учитывая, что вам удалось создать объект, это может быть CLSID объекта. Значит, это не тот IID. Вам нужно вернуться к своим коллегам по Delphi и попросить их рассказать вам, что такое IID интерфейса IResSrvDll .

Снова отредактируйте: Вы можете попробовать изменить указанный вами член перечисления из ComInterfaceType . Они должны быть для IDispatch и "dual" - хотя, поскольку ваш объект не поддерживает IDispatch , ни один из них не должен быть правильным выбором. Параметр IUnknown (который отображается в вашем примере кода) должен работать, что указывает на неправильность IID.

1
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: