C # - подключиться к существующему объекту COM - PullRequest
4 голосов
/ 14 октября 2009

Скажем, у нас есть существующий процесс (или приложение), который вызывает COM-объект из ocx-файла, такого как "MyCOMLibrary.ocx".

Есть ли способ написать библиотеку C # для точной репликации файла ocx? Чтобы исходное приложение могло вызывать ваш код C #, а не исходный объект COM?

Вы, конечно, должны будете использовать идентичные идентификаторы CLSID и ProgID в качестве исходного ocx. И при условии, что в подписи нет участия, такого как SNK в мире .Net.

Кроме того, существуют ли какие-либо инструменты для автоматизации этого? Что-то, что принимает ocx и выплевывает C # файл с методами для реализации.

РЕДАКТИРОВАТЬ: Я хочу добавить, что исходное приложение VB6, и не использует .Net вообще. Скорее всего, они загружают OCX, как приложение VB6 (ProgId или Guid). Это вызывает какие-либо проблемы?

У нас также нет проблем с полным переписыванием ocx - мы, скорее всего, просто вернем коды ошибок успеха для всех методов и будем использовать только методы / события, требуемые нашей ситуацией.

РЕДАКТИРОВАТЬ: Вы могли бы подумать, что это не будет слишком сложно сделать. Можем ли мы создать файл ocx VB6, который мог бы заменить старый ocx, и просто передать все вызовы сборке .Net?

РЕДАКТИРОВАТЬ: я пытался использовать следующую библиотеку с открытым исходным кодом: EasyHook

Но, похоже, этот вопрос все еще должен быть жизнеспособным. VB6, кажется, загружает COM-объекты таким образом, чтобы предотвратить перехват. Я не вижу способа перехватить методы экземпляра для класса / интерфейса или конструктора класса с помощью EasyHook.

Ответы [ 4 ]

3 голосов
/ 14 октября 2009

Вы можете использовать ActiveX Import AxImp, чтобы импортировать OCX, создать класс-оболочку и затем вызвать его. Программа описана здесь: http://msdn.microsoft.com/en-us/library/8ccdh774(VS.80).aspx По сути, вам нужно выполнить в командной строке следующее:

c:/>AxImp MyControl.ocx

Результатом являются MyControl.dll и AxMyControl.dll. Первый вы можете использовать как обычную .NET DLL в своих проектах (т. Е. Без графического интерфейса пользователя), второй можно использовать для рисования в форме, как вы это обычно делаете с любым другим элементом управления, например TextBox или Label.

Чтобы использовать его, перейдите в Visual Studio, щелкните правой кнопкой мыши свой проект и выберите Добавить ссылку. Перейдите к недавно созданной DLL и добавьте ее. Вот и все.

2 голосов
/ 26 ноября 2009

Наша библиотека Deviare Hook Library может использоваться для перехвата COM-объектов. Вы можете увидеть статью из нашего блога, связанную с этой темой: Перехват COM-объектов Outlook с помощью Deviare

1 голос
/ 23 октября 2009

Очевидно, VBMigration Partner может автоматически обновить компонент COM VB6 до компонента VB.Net, который имеет двоичную совместимость с исходным компонентом VB6 . Я не знаю, поддерживает ли он OCXs. Если это произойдет, я бы предложил сначала использовать это, а затем попытаться перейти на C # позже (при необходимости).

0 голосов
/ 02 февраля 2010

Не совсем полный ответ на вопрос, но кое-что, я думаю, может быть полезным. Если вы добавляете ключ с именем «TreatAs» под CLSID объекта, который вы хотите заменить, и устанавливаете в качестве значения по умолчанию значение CLSID объекта, который вы хотите создать вместо этого, это дает указание среде выполнения COM создать ваш объект вместо исходного. , Тогда нет необходимости заставлять ваш новый замещающий объект иметь тот же CLSID и ProgID, что и у старого.

Например, если ваш исходный объект имел ProgID "MyComLibrary.Object" и CLSID "{ABC}", а ваш новый объект имеет ProgID "MyDotNet.Object" и CLSID "{123}", то в разделе HKLM / CLSID / {ABC} добавить ключ с именем TreatAs со значением по умолчанию {123}. Тогда любой запрос для «MyComLibrary.Object» или «MyDotNet.Object» получит копию нового объекта (при условии, что они реализуют те же интерфейсы).

...