2013-07-16 1 views
2

Я пишу программы, которые используют другое приложение.
Позволяет сказать Application ProgID является TheCompany.TheProgИспользуйте COM +-объект в Visual Studio C# без использования Interop-DLL

до недо сейчас, я использую «Добавить ссылки/COM» и выберите TheProg Тип Lib

, но он был упомянут в 3ED партии поставщик, создающий библиотеки Interop DLL, не поддерживается и может вызвать некоторые изменения интерфейса при обновлении версии.

Мой вопрос: Как я могу ссылаться на этот TheCompany.TheProg COM + объект без создания библиотеки взаимодействия?

Я знаю, что я могу использовать

Type theProgType = Type.GetTypeFromProgID("TheCompany.TheProg"); 
dynamic myObject = Activator.CreateInstance(theProgType); 
dynamic version = myObject.AMethod(); 

но: 1. мне нужно бросить Everything динамичную, которые требуют .NET FW v4!
, если я не хочу использовать theProgType.InvokeMethod() :)
2. У меня нет IntelliSense.

Большое спасибо

+0

Я знаю, что это старо, но если вы все еще ищете ответ, возможно, мой будет работать на вас. – Noseratio

ответ

1

Не могу себе дать поздний ответ на этот вопрос, как я только что имел дело с подобной вещью.

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

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] // late binding only 
[Guid("00020400-0000-0000-C000-000000000046")] // IDispatch's GUID 
interface IMyLateBindingAdaptor 
{ 
    // a subset of IWebBrowser2 [http://msdn.microsoft.com/en-us/library/aa752127(v=vs.85).aspx] 
    string LocationURL { get; } 
    void Navigate(string url, ref object flags, ref object TargetFrameName, ref object PostData, ref object Headers); 
} 

Убедитесь, имена и подписи определенными свойствами и способ соответствовать спецификации от вашего поставщик.

С его помощью:

var adaptor = this.webBrowser1.ActiveXInstance as IMyLateBindingAdaptor; 
if (null == adaptor) 
    throw new ApplicationException("No late binding."); 
object missing = Type.Missing; // VT_EMPTY 
adaptor.Navigate("http://www.example.com", ref missing, ref missing, ref missing, ref missing); 
MessageBox.Show(adaptor.LocationURL); 

На мой взгляд, это лучше, чем динамики, поскольку это дает вам безопасность во время компиляции типа (вроде) и IntelliSense.

+0

1. Не так ли, как с помощью инструмента TLBImp для создания Interop.Dll? –

+1

№ В отличие от TLBImp, при таком подходе ** нет явных привязок ** к любому из API от вашего поставщика **, кроме самих имен **. Нет числовых DISPIDs, поэтому C# будет вызывать [IDispatch :: GetIDsOfNames] (http://msdn.microsoft.com/en-us/library/ms221306 (v = vs.85) .aspx) во время выполнения, когда это необходимо для решения новое имя. Ваш поставщик может изменить порядок методов, GUID, DISPID или добавить новые методы. Но пока они сохраняют имена и аргументы метода одинаковыми для существующих методов, ваш код должен работать без перекомпиляции. Вы просто запустите новую COM-серверную DLL. – Noseratio

+0

Хорошо, хорошо знать, мой TLB имеет более 100 классов с avg из 50 открытых членов, есть ли инструмент (похожий на TLBImp), который будет автоматически создавать этот код? –