|
|
|
Irinac |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 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) |
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |