com-объект из c# не работает в проекте c ++ - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь понять концепцию com-объекта

Я не понимаю, что я делаю неправильно. import не создавать файл .tlh

#include "pch.h"
#include <Windows.h>

using namespace System;
using namespace System::Runtime::InteropServices;

//#import "C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb"
#import "COM_test.tlb" named_guids raw_interfaces_only
//#import "<Full Path>\COM_test.tlb" named_guids raw_interfaces_only

int main(array<System::String ^> ^args)
{
    CoInitialize(NULL);   //Initialize all COM Components

// <namespace>::<InterfaceName>
    COM_test::ICalculator calc;

    // CreateInstance parameters
    // e.g. CreateInstance (<namespace::CLSID_<ClassName>)
    HRESULT hRes = calc.CreateInstance(COM_test::Calculator);

    //COM_test::Calculator calc;
    //int a = calc.Sum(1,2);
    int a = 0;
    Console::WriteLine(a);
    Console::ReadLine();
    return 0;
}

Visual Studio: введите описание изображения здесь

C# com:

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace COM_test
{
    [Guid("7FAFBE67-24F0-44F9-8C0C-10F795C4E838")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ICalculator
    {
        int Sum(int a, int b);
    }

    [Guid("9A946209-4EF3-47BD-B4C7-8B1F2EFFCF53")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(ICalculator))]
    [ComVisible(true)]
    public class Calculator : ICalculator
    {
        public int Sum(int a, int b)
        {
            return a + b;
        }
    }
}

AssemblyInfo.cs:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// Общие сведения об этой сборке предоставляются следующим набором
// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
// связанные со сборкой.
[assembly: AssemblyTitle("COM_test")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("MagaEnterprise")]
[assembly: AssemblyProduct("COM_test")]
[assembly: AssemblyCopyright("Copyright ©  2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
[assembly: ComVisible(true)]
[assembly: AssemblyKeyFile("COM_test.snk")]

// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
[assembly: Guid("2bacca61-7291-4b5d-aeab-16e2b2d6c93f")]

// Сведения о версии сборки состоят из указанных ниже четырех значений:
//
//      Основной номер версии
//      Дополнительный номер версии
//      Номер сборки
//      Редакция
//
// Можно задать все значения или принять номера сборки и редакции по умолчанию 
// используя "*", как показано ниже:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0.0")]
[assembly: AssemblyFileVersion("1.2.0.0")]
...