Поиск:

Ответ в темуСоздание новой темы Создание опроса
> COM C# загружается в C++ только где есть VS2015 
:(
    Опции темы
Irinac
Дата 25.12.2019, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.12.2019

Репутация: нет
Всего: нет



Есть необходимость подключать формы на С# к программе на C++ (visual studio 2015). Пробовала 2 найденными способами, но результат один и тот же.
1) Без регистрации в реестре
2) С регистрацией в реестре
Пробовала, как регистрировать с помощью
C:\Windows\Microsoft.NET\Framework\ v4.0.30319\RegAsm.exe "C:\..\Debug\Csarp.dll" /tlb
Так и самостоятельным созданием в консоли управления rusell.livejournal.com/143927

В итоге на компьютере, где компилирую проект, оба варианта работают. При переноси на другу машину, получаю одну и ту же ошибку «Безымянный.png”

Суть тестовых проектов одинаковая: создаю библиотеку COM на C#, подключаю к библиотеки С++ и вывожу в консоль С++, что бы проверить работает ли.

Буду рада, если подскажите, в чем ошибаюсь.


1) С#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Charp
{
[ComVisible(true)] // Don't forget
[ClassInterface(ClassInterfaceType.A utoDual)] // these two lines
[Guid("7ABD37A5-FE77-4229-A544-4802ADEEAEA6")]
public class CharpCOM
{
public String GetTheThing(String arg) // Make sure this is public

{

MessageBox.Show("Привет");
return arg + "HelloForm";

}
}
}
C++ cpp
#include "stdafx.h"
#include <Windows.h>

#include <iostream>

#include <utility>
#include <limits.h>
#include "MyDLL.h"
#import "..\Charp\bin\Debug\Charp.tlb" raw_interfaces_only




const char* functionIMy()
{



CoInitialize(0); // Init COM
BSTR thing_to_send = ::SysAllocString(L"My thing, or ... ");
BSTR returned_thing;
Charp::_CharpCOMPtr obj(__uuidof(Charp::CharpCOM));
HRESULT hResult = obj->GetTheThing(thing_to_send, &returned_thing);


const char* hello = _com_util::ConvertBSTRToString(retu rned_thing);

return hello;

}
С++ h

#pragma once

#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif



extern "C" MATHLIBRARY_API const char* functionIMy();

2) C# класс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace Csarp
{
[ComVisible(true)] // Don't forget
// [ClassInterface(ClassInterfaceType.A utoDual)] // these two lines
[Guid("2005C5E0-CFB9-4A8A-9676-06671BBEE6AD")]
[ClassInterface(ClassInterfaceType.N one)]
[ProgId("Csarp.ClassMe")]
public class ClassMe : IInterface
{
private bool connected;

public void Connect()
{

MessageBox.Show("привет");

}

public void Disconnect()
{
MessageBox.Show("пока");
}

public void test()
{
MessageBox.Show("тест");
}

public void test2()
{
MessageBox.Show("тест2");
}
}
}

С# интерфейс

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

namespace Csarp
{
[ComVisible(true)] // Don't forget
[Guid("2EB4A076-E600-4E0C-B7E0-5660CA5C2CD6")]
[InterfaceType(ComInterfaceType.Inte rfaceIsDual)]
public interface IInterface
{
void Connect();

void Disconnect();

void test();
void test2();
}
}

С++ h
#pragma once
#ifdef DLLFUNCTION_EXPORTS
#define DLLFUNCTION_API __declspec(dllexport)
#else
#define DLLFUNCTION_API __declspec(dllimport)
#endif


extern "C" DLLFUNCTION_API const char* connect();


extern "C" DLLFUNCTION_API const char* disconnect();


extern "C" DLLFUNCTION_API const char* test();


extern "C" DLLFUNCTION_API const char* test2();

C++ cpp
// Dllfunction.cpp : Определяет экспортированные функции для приложения DLL.
//

#include "stdafx.h"
#include <utility>
#include <limits.h>
#include "Dllfunction.h"

#import "..\Csarp\bin\Debug\Csarp.tlb"

const char* connect()
{
CoInitialize(NULL);

Csarp::IInterfacePtr yourClass(__uuidof(Csarp::ClassMe)) ;

yourClass->Connect();

CoUninitialize();
return "0";
}


const char* disconnect()
{
CoInitialize(NULL);

Csarp::IInterfacePtr yourClass(__uuidof(Csarp::ClassMe)) ;

yourClass->Disconnect();

CoUninitialize();
return "0";
}

const char* test()
{
CoInitialize(NULL);

Csarp::IInterfacePtr yourClass(__uuidof(Csarp::ClassMe)) ;

yourClass->test();

CoUninitialize();
return "0";
}

const char* test2()
{
CoInitialize(NULL);

Csarp::IInterfacePtr yourClass(__uuidof(Csarp::ClassMe)) ;

yourClass->test2();

CoUninitialize();
return "2";
}

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Безымянный.png 8,00 Kb
PM MAIL   Вверх
xvr
Дата 26.12.2019, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Для запуска такого COM точно понадобится .NET runtime (причём той версии, на которой собирался COM), и возможно VC runtime (так же версии от VS2015)
Для второго в VS есть специальная папка (например у меня в VS2017 - C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012) 
Для первого вам нужен .NET 4.0 (лежит например тут - https://www.microsoft.com/ru-ru/download/de....aspx?id=17851)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0975 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.