2014-01-24 1 views
5

Во-первых, я новичок в COM, и в настоящее время довольно смущен. Я прочитал много документации по COM на MSDN и в общей сети, но многие из них кажутся устаревшими и чрезмерно сложными.Как создать HelloWorld COM Interop в Visual Studio 2012

Вот что я считаю необходимым, чтобы заставить его работать. Это еще не так, поэтому я уверен, что чего-то не хватает, но, давая свой рецепт, я надеюсь, что кто-то может решить проблему:

  1. Создайте проект приложения консоли C#. Я назову его CSharpApp
  2. Создайте проект ATL C++. Я называю это ComLib.Interop.
    • Добавить класс (шаблон: ATL Simple Object), который я называю "InteropDemo"
    • Ввиду класса, щелкните правой кнопкой мыши IInteropDemo и добавить метод HelloWorld.
  3. (Удален, продолжал держать нумерацию в ответах правильно.)
  4. Compile.
  5. Добавьте ссылку на ComLib.Interop.dll на CSharpApp.
    • Вызов regsrv32.exe на скомпилированный DLL COM, а затем выберите DLL на вкладке COM в "Добавить ссылки ...
  6. В Program.cs, Main, создать класс InteropDemo и вызвать HelloWorld ,
  7. Прибыль.

Благодаря ответам, я обновил вопрос, чтобы отразить комбинированное решение.

+0

Я не думаю, что вам нужны шаги 3, 4. Попробуйте без них. – Noseratio

+0

Можно сказать, что сам COM устарел и чрезмерно сложный, следовательно, он больше не развивается. Если вы серьезно относитесь к разработке COM-серверов/объектов с C++, то я рекомендую вам получить книгу Essential COM от Don Box. Дон был гуру COM в конце 90-х и начале 2000-х годов, прежде чем он пошел на работу над первыми версиями WCF. Стоит его вес в золоте. –

+0

@Noseratio Не работает, я получаю [эту ошибку] ​​(http://tinypic.com/view.php?pic=2hob3f4&s=5#.UuJjpxA1haQ). Однако вызов tlbimp вручную в ComLib.Interop.dll работает, и я могу добавить ComLib.InteropLib.dll, сгенерированный tlbimp. Но потом я снова столкнулся с проблемой с регистрацией. Обновлен вопрос. – Wilbert

ответ

3

Попробуйте выполнить следующие действия:

  1. Убедитесь, что оба проекта, но неуправляемый C++ и управляемого C# имеют одинаковую разрядность, x86 или x64. Скажем, это x86, для ясности.
  2. Открыть Администратор командной строки и зарегистрировать COM DLL: C:\Windows\SysWOW64\regsvr32.exe c:\full-path\ComLib.Interop.dll
  3. Run Visual Studio как Администратор. Сделайте шаги 1,2,4,5,6. Не делайте 3.

Посмотрите, дойдете ли вы до 7. Я думаю, это должно сработать.

Обратите внимание, что вам требуется только регистрация на машине разработки. Изолированный COM должен работать везде.

+0

Сработало: я могу вызвать HelloWorld на моей машине dev на зарегистрированной COM-dll. Но если я включу «Изолированный», он получит ошибку сборки: '' 'Проблема выделения COM-ссылки 'ComLibInteropLib': для этого компонента не было обнаружено зарегистрированных классов. '' ' – Wilbert

+0

@ Вилберт, ошибка или предупреждение? Вы уверены, что оба проекта - x86, .NET тоже? Вы не можете использовать 'AnyCPU'. – Noseratio

+0

Оба проекта - x64 (я использовал это с тех пор, как начал с x64, и зарегистрировал dll с помощью System32 \ regsrv32.exe вместо wow64). Я могу выполнить свой CSharpApp.exe с зарегистрированной dll, и он выдает правильную строку hello world из метода com dll. – Wilbert

3

Возможно, вы ошиблись на шаге 2, учитывая, что вы не получили ошибку сборки. Мастер дает вам более одного выбора для вида класса, который вы добавляете. По умолчанию выбран «класс C++», вам нужно вместо этого выбрать ATL + «ATL Simple Object».

Теперь в окне просмотра класса отображаются два добавляемых типа, интерфейс IInteropDemo и класс CInteropDemo, который реализует интерфейс. Затем щелкните правой кнопкой мыши по интерфейсу (не классу) и используйте «Добавить метод».Теперь вы можете также взглянуть на файл IDL в проекте, он должен выглядеть следующим образом:

import "oaidl.idl"; 
import "ocidl.idl"; 

[ 
    object, 
    uuid(CBA0D899-2F4C-4F1D-A935-C80CB981C153), 
    dual, 
    nonextensible, 
    pointer_default(unique) 
] 
interface IInteropDemo : IDispatch{ 
    [id(1)] HRESULT Method(); 
}; 
[ 
    uuid(ED14ACED-4FF9-4144-B302-CC48C481F28B), 
    version(1.0), 
] 
library ATLProject4Lib 
{ 
    importlib("stdole2.tlb"); 
    [ 
     uuid(8543642F-9927-451C-9784-6A7774418299)  
    ] 
    coclass InteropDemo 
    { 
     [default] interface IInteropDemo; 
    }; 
}; 

Этого достаточно, чтобы получить его построили. Который должен потерпеть неудачу в любой современной версии Windows, UAC предотвращает регистрацию COM-сервера. Для этого требуется шаг # 0: запустите Visual Studio, щелкнув правой кнопкой мыши ярлык и выбрав «Запуск от имени администратора».

+0

Я действительно сделал это правильно и сгенерировал класс на основе ATL Simple Object, и я добавил метод интерфейс. Если я нажму на один из интерфейсов IInteropDemo (один с текстом hover-text «struct IInterfaceDemo»), я вижу функцию HellowWorld в маленьком ящике ниже. – Wilbert

+0

Я также проверил файл .idl, к интерфейсу добавлен метод HelloWorld. – Wilbert

+0

Спасибо. Я добавил следующий вопрос [здесь] (http://stackoverflow.com/q/21335520/1591992) – Wilbert

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

  • Нет связанных вопросов^_^