2009-10-13 4 views
4

Скажем, у нас есть существующий процесс (или приложение), который вызывает COM-объект из ocx-файла, такого как «MyCOMLibrary.ocx».C# - Подключиться к существующему объекту COM

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

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

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

EDIT: Я хочу добавить, что исходное приложение VB6 и не использует .Net вообще. Они, скорее всего, загружают ocx в качестве приложения VB6 (ProgId или Guid). Означает ли это какие-либо проблемы?

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

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

EDIT: Я попытался с помощью следующей открытой библиотеки источник: EasyHook

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

+0

То, что вы предлагаете, возможно, но опасно. Вы бы заменили этот элемент управления для любого приложения. Я не рекомендую это делать, если вы не пытаетесь взломать что-то, что я также не рекомендую. :) –

+1

Мы пытаемся подражать аппаратным устройствам для взаимодействия с устаревшим приложением «точка продажи». Не будет проблем с заменой этого ocx глобально для ПК. – jonathanpeppers

+0

Возможный дубликат [C# - запись COM-сервера - Свойства сопоставлены с методами] (http://stackoverflow.com/questions/1614702/c-sharp-writing-a-com-server-properties-mapped-to-methods) – jonathanpeppers

ответ

2

Вы можете использовать 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 и добавьте ее. Это все.

+0

TlBimp.exe, делает то же самое, не выплевывая элемент управления ActiveX. Вы понимаете, я пытаюсь заменить COM-объект, не назову его, не так ли? Я могу увидеть, где я могу открыть полученный Interop..dll в Reflector и экспортировать его как файл C# для реализации методов. Это то, что вы имеете в виду? – jonathanpeppers

+0

Вы можете полностью заменить только двоичный COM-объект (т. Е. Без оболочки), если у вас есть источник: конвертируйте его в .NET. Архитектура .NET и COM очень разные. Вы можете создать COM с .NET, и вы можете импортировать COM для .NET. Но сам COM-код сам по себе не совместим с CLR и не может быть преобразован в .NET без перезаписи. – Abel

+0

О: «Есть ли способ написать библиотеку C# для точной репликации файла ocx», ответ: да, но только как полная переписывание (используйте 'ComVisible' и др.). Возможно, можно добавить OCX и оболочку в качестве ресурса и переадресовать процесс загрузки сборки в AppDomain, зарегистрировавшись на событие '' AssemblyLoad. Но это становится очень сложным и требует глубокого понимания «Domain», сборки и, возможно, динамической OCX-упаковки. – Abel

2

Наша библиотека для рукописей Deviare может использоваться для подключения объектов COM. Вы можете посмотреть статьи из нашего блога, связанные с этой темой: Hooking Outlook COM objects with Deviare

0

Не совсем полный ответ на вопрос, но я думаю, что это может быть полезно. Если вы добавите ключ под названием «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» получит копию нового объекта (при условии, что они реализуют одни и те же интерфейсы).

+0

В нашем окончательном решении мы реализовали объект C# COM, который был совместим с двоичными файлами и настроил его для целевого приложения с Reg-Free COM. Поэтому наше целевое приложение загрузило нашу сборку через COM, считая, что она все еще разговаривает с исходным COM-объектом. – jonathanpeppers

Смежные вопросы