Я пытаюсь понять концепцию 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")]