CoCreateInstance C ++ / CLI класс из родного C ++ - PullRequest
1 голос
/ 01 апреля 2012

Я объявил класс C ++ / CLI, как показано ниже

namespace testcominterface {

  [ComVisible(true)]
  [Guid("FFCA805F-8DAB-4AF8-A7B7-B488136E8177")]
  public interface class ITestInterface
  {
      public :
          void TestMethod();
  };


  [ComVisible(true)]
  [Guid("E65F4772-54B5-4105-83E5-DCED24ABC815")]
  [ClassInterface(ClassInterfaceType::AutoDual)]
  [ComDefaultInterface(ITestInterface::typeid)]       
  public ref class testCoClass : ITestInterface
  {
      public:
          virtual void TestMethod()
                {

                    Console::WriteLine("testCoClass::TestMethod : Test method");

                }
  };
 }

И я хочу создать «testCoClass» через собственный C ++ COM (путем #import файла TLB и использования CoCreateInstance) Я всегда получаю ошибку«Класс не зарегистрирован».Если я использую «Regasm.exe» для регистрации сборки, она работает нормально, но я не хочу регистрировать сборку.

Я выполнил действия, описанные в этом сообщении в блоге http://blogs.msdn.com/b/cheller/archive/2006/08/24/how-to-embed-a-manifest-in-an-assembly-let-me-count-the-ways.aspx, чтобы встроитьпроявиться в Ассамблее, но это не сработало.(Обратите внимание, что этот метод всегда работает со сборкой C #, но это сборка C ++ / CLI.

Я ценю любые предложения.

1 Ответ

2 голосов
/ 01 апреля 2012

COM-сервер должен быть зарегистрирован, чтобы COM мог найти DLL, когда клиентская программа запрашивает ее. Технически этого можно избежать, предоставив клиентской программе манифест со свободными от регистра записями COM, <clrClass> требуется для серверов COM, которые написаны с использованием управляемого кода. Ключевым моментом является то, что этот манифест должен быть встроен в клиент , а не в сервер. Пока не заходите туда, пока ваш COM-сервер не работает должным образом.

Одна стандартная ошибка - забыть использовать параметр / codebase с Regasm.exe. Без этого сборка должна быть строго названа и помещена в GAC. Это не то, что вы хотите сделать на своем компьютере разработчика. Другая распространенная ошибка - использование неправильной версии Regasm.exe. Вам нужно обратить внимание на разрядность на 64-битной машине. И выберите правильный, если вы используете VS2010 и GAC, .NET 4 имеет другое местоположение для GAC.

Вы должны улучшить атрибуты, которые вы используете. Правильный COM-сервер только предоставляет интерфейсы и скрывает реализацию. Используйте [InterfaceType (ComInterfaceType :: InterfaceIsDual)] в объявлении интерфейса и [ClassInterface (ClassInterfaceType :: None)] в классе. Теперь вам больше не нужен [ComDefaultInterface], и ​​зависимость библиотеки типов от mscorlib.tlb исчезнет.

Если у вас все еще есть проблемы, то утилита SysInternals ProcMon может точно показать вам, где в реестре клиент искал ваш сервер, и сравнить его с фактическими местоположениями реестра, которые использует ваш сервер.

...