Как зарегистрировать класс C# для COM?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как зарегистрировать класс C# для COM?

Сообщение Anonymous »

Я хотел бы создать библиотеку C# WPF, предоставляющую некоторый класс COM, чтобы использовать функциональность класса из отдельного проекта C++.
Я хотел бы иметь класс WPF, реализующий простую форму, например окно, где могу ли я выводить текстовые сообщения, используя «shared». открытая функция, скажем, OutputText. Я хочу создать экземпляр объекта класса, который, в свою очередь, просто создает текстовое окно формы, а с помощью OutputText просто отправляет в него некоторый текст. Все это необходимо сделать из приложения C++, используя открытый класс COM и функцию CoCreateInstance, чтобы все заработало.
Вот код C#:

Код: Выделить всё

using Microsoft.SqlServer.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfCustomControlLibrary11
{
[Guid("0E633447-41D9-4E28-A8F4-D24ADE2913CD")]
public interface ICustomControl1
{
void Test();
}
[Guid("2002FDA9-E74A-4A88-B0E3-0CCD2C2695AD")]
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}

public void Test()
{
MessageBox.Show("CustomControl1 - Test");
System.Console.Beep();
}
}
}
и код C++, вызывающий открытый класс COM:

Код: Выделить всё

#include 
#include 
#include 
#import  
//#include 

EXTERN_C const CLSID CLSID_FileOpenDialog2;

const GUID CLSID_riid = { 0xe633447, 0x41d9, 0x4e28, { 0xa8, 0xf4, 0xd2, 0x4a, 0xde, 0x29, 0x13, 0xcd } };
const GUID CLSID_rclsid = { 0x2002fda9, 0xe74a, 0x4a88, { 0xb0, 0xe3, 0xc, 0xcd, 0x2c, 0x26, 0x95, 0xad } };

using namespace std;
using namespace WpfCustomControlLibrary11;

HANDLE fileHandle;
char buffer[100];
ICustomControl1* g_pMyComClient = NULL;
HRESULT g_hr = NULL;

void RunClient() {

HRESULT hr = CoInitializeEx(NULL,
//COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE
COINIT_MULTITHREADED
);
if (SUCCEEDED(hr))
{
ICustomControl1* pMyComClient;

hr = CoCreateInstance(
CLSID_rclsid,
NULL, CLSCTX_ALL,
CLSID_riid,
reinterpret_cast(&pMyComClient));

if (SUCCEEDED(hr)) {
g_hr = hr;
g_pMyComClient = pMyComClient;
pMyComClient->Test();
}

CoUninitialize();
}
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow)
{
sprintf(buffer, "WinMain - creating Client thread\n");
OutputDebugString(buffer);
buffer[0] = '\0';

thread newThread(RunClient);
newThread.join();

sprintf(buffer, "WinMain - Client thread has ENDED!\n");
OutputDebugString(buffer);
buffer[0] = '\0';

return 0;
}
Я выполнил следующие шаги:
  • создал проект C#, используя шаблон WPF Custom Control Library (.NET Fremework).
  • отметил "Сделать сборку COM-видимой" в проекте настройки.
  • подписал библиотеку, используя "sn -k Proj_Name.snk", а затем указав этот ключ в разделе "подпись" в настройках проекта.
  • зарегистрировался через RegAsm.exe
  • добавлено в GAC через gacutil /i
Теперь, когда я запускаю клиент C++, я получаю сообщение об ошибке «REGDB_E_CLASSNOTREG Класс не зарегистрирован» в ответ на CoCreateInstance вызов.
Что любопытно, когда я создаю только проект Windows Forms, используя шаблон Windows Forms Control Library (.NET Fremework), и выполняю описанные выше шаги, все работает отлично - CoCreateInstance не возвращает ошибок, и функция test успешно выполняется. вызывается.
Какова может быть причина того, что класс проекта WPF НЕ регистрируется и, следовательно, не используется клиентом C++, в то время как класс проекта Windows Forms регистрируется и работает безупречно?
Заранее спасибо за помощь!>

Подробнее здесь: https://stackoverflow.com/questions/798 ... ss-for-com
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»