Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
-16 / 9 / 6
Регистрация: 03.10.2012
Сообщений: 532
1

Передача экземпляра обьекта в функцию dllexport

14.05.2017, 16:03. Просмотров 1524. Ответов 12
Метки нет (Все метки)

Здравствуйте, столкнулся с такой проблемой. Вот рабочий код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>;
#include <iostream>;
#using <SharpFunction.dll>
 
using namespace std;
using namespace SharpFunction;
 
 
extern "C"
{
    __declspec(dllexport) void HelloWorld()
    {
        cout << "Hello World" << endl;
        SharpFunction::Class1::HelloWorld2();
 
        Class1^ example = gcnew Class1();
        example->HelloWorld3();
    }
}
Тобишь я могу обьявить C# экземпляр в плюсах и это работает. Но вот мне нужно передать из C# в C++ экземпляр что бы плюсы в дальнейшем работали с экземпляром и по идеи получается вот такой вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>;
#include <iostream>;
#using <SharpFunction.dll>
 
using namespace std;
using namespace SharpFunction;
 
 
extern "C"
{
    __declspec(dllexport) void HelloWorld(Class1^ example)
    {
        cout << "Hello World" << endl;
        SharpFunction::Class1::HelloWorld2();
 
        example->HelloWorld3();
    }
}
и в таком случае компилятор мне выдает ошибку именно при компиляции:
C3395 HelloWorld: __declspec(dllexport) невозможно применять к функции с соглашением вызова __clrcall \MathFuncsDll\MathFuncsDll.cpp:12 Line
Как можно избежать данной ошибки?

Добавлено через 5 часов 38 минут
Что? Совсем не кто не знает? На столько не тривиальная задача?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2017, 16:03
Ответы с готовыми решениями:

Передача в функцию обьекта
Всем привет. В интернете ничего не нашел по этому поводу: Я делаю шашки и у меня есть класс USER...

Передача свойств обьекта в функцию openGL
Здравствуйте уважаемые форумчане..Пришел к вам со следующей нуждой: У меня есть класс тайловой...

Передача экземпляра собственного класса в функцию
У меня есть класс MyClass с полями X, Y , Radius, Id. Еще в нем есть функция-член. Возможно ли с...

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include &lt;iostream&gt; struct foo { foo(int){std::cout &lt;&lt; &quot;int...

12
-16 / 9 / 6
Регистрация: 03.10.2012
Сообщений: 532
17.05.2017, 14:45  [ТС] 2
Ребята! Проблема актуальна! РЕБЯТА!

Решил проблему с этой ошибкой но проблема появилась в другом - C# мне говорит что нет такой точки входа.
0
Администратор
Эксперт .NET
12883 / 10503 / 4355
Регистрация: 17.03.2014
Сообщений: 21,188
Записей в блоге: 1
17.05.2017, 15:03 3
Цитата Сообщение от SkoTi Посмотреть сообщение
проблема появилась в другом - C# мне говорит что нет такой точки входа.
Посмотри с помощью dumpbin какие функции экспортирует твоя DLL
0
4441 / 3129 / 1340
Регистрация: 09.05.2015
Сообщений: 7,682
17.05.2017, 15:11 4
А зачем экспортировать managed метод, да еще через dllexport, если его можно и так вызвать из C# без всяких проблем? Создайте обычный managed class, в нем статический метод и вызывайте из C# или любого другого .NET языка...
0
-16 / 9 / 6
Регистрация: 03.10.2012
Сообщений: 532
18.05.2017, 05:25  [ТС] 5
Мне нужно написать модификацию для сервера игры, У нас пытливые умы любят дампать C# и юзать их потом в открытую. Я хочу сделать жосткую подвязку а возможно и связку. А игра на Unity3d - тобишь весь код игры это C# dll
И там к примеру есть класс BasePlayer - и экземпляр данного класса из C# из хука мне нужно передать в обработчик действий в C++
Допустим что бы юзнуть у данного экземпляра метод с нужными параметрами в плюсах.
Да и не только такое делать, в общем у меня получится гибрид так как с C# я уже сижу около 3х лет да и вся моя работа подвязана на C# но в связи с потребностью в защите ПО от ололо рефлекторщиков да и юзать определенные функции WindowsAPI нужно.

Помогите =(

Добавлено через 58 секунд
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Посмотри с помощью dumpbin какие функции экспортирует твоя DLL
Просветите пожалуйста, ненашел не чего в гугле дельного кроме dumpbin.exe

Добавлено через 11 часов 33 минуты
Тоесть проблема не решаема?
0
4441 / 3129 / 1340
Регистрация: 09.05.2015
Сообщений: 7,682
18.05.2017, 06:04 6
Нельзя просто так взять и передать managed объект в unmanaged код. Можно передавать простые вещи типа указателей, структур, массивов структур, делегатов и т.д.
0
-16 / 9 / 6
Регистрация: 03.10.2012
Сообщений: 532
18.05.2017, 06:37  [ТС] 7
Я читал гдето что можно пометить - managed или unmanaged код.
Мне любым способом нужно передать в C++ обьект. Ведь в самих же плюсах я могу его создать! А почему передать не могу дестопер на него?
0
4441 / 3129 / 1340
Регистрация: 09.05.2015
Сообщений: 7,682
18.05.2017, 15:51 8
Передать можете, но не через dllexport, а по нормальному, создав класс и в нем метод принимающий объект в качестве параметра....
0
-16 / 9 / 6
Регистрация: 03.10.2012
Сообщений: 532
18.05.2017, 16:46  [ТС] 9
Someone007, Продемонстрируйте пожаалуйста пример. Тоесть здесь тоже самое что extern "C" dllexport
только без данных атрибутов - а просто обычный класс и попробывать его вызвать? но как сделать тогда так что бы метод был точкой входа - вот в чем вопрос заключается.
0
4441 / 3129 / 1340
Регистрация: 09.05.2015
Сообщений: 7,682
18.05.2017, 19:21 10
Ну вот пример, 2 библиотеки, одна на C#, вторая на C++/CLI, и консольное приложение на C# которое создает класс из библиотеки на C# и передает его в класс из библиотеки на С++/CLI...

Точку входа сделать нельзя. Зачем она вам нужна вообще если вы сами вызываете метод?
1
Вложения
Тип файла: zip ConsoleApp2.zip (12.9 Кб, 6 просмотров)
4441 / 3129 / 1340
Регистрация: 09.05.2015
Сообщений: 7,682
19.05.2017, 01:37 11
Лучший ответ Сообщение было отмечено SkoTi как решение

Решение

Добавил еще один, более извращенный способ передачи объекта...
1
Вложения
Тип файла: zip ConsoleApp2.zip (13.2 Кб, 2 просмотров)
-16 / 9 / 6
Регистрация: 03.10.2012
Сообщений: 532
19.05.2017, 07:48  [ТС] 12
Someone007, Ваш второй вариант это как бы вроде то что мне и нужно было. Я всё перепробывал - и я даже не думал что нужно в атребутах писать void

Вот только беда... Я взял DLL плюсовскую и оказалось что это вообще не плюсы! это C#!!!! написаный на C++
В общем полное разочерование... Где ваша там DLL? Я сейчас за меньше минуты перепишу её с помощью IL кода. так как там изи вообще.
А я как раз и пытаюсь избавится от этого =( От прямого чтения исходного кода файла и частичная или почти полная защита от простого редактирования.
В общем разочерование, вот ваш исходный код в читабельном виде
Передача экземпляра обьекта в функцию dllexport


Я именно ищу способ реализации как у steam_api.dll Что бы открыть нельзя было - а юзать можно.
Я так понимаю CLR мне не подходит =( А нужно юзать чистые плюсы а там не using, не обьектов из C# =( ну чтож, пошел капать =(
0
4441 / 3129 / 1340
Регистрация: 09.05.2015
Сообщений: 7,682
19.05.2017, 15:11 13
Вот только кода второго, извращенного варианта вы в обычном .NET декомпиляторе уже не увидите, вы ведь именно этого и хотели, разве нет?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2017, 15:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Передача обьекта
Ребят подскажите как передать обьект со всеми его свойствами в функцию повершел. допустим есть...

Передача обьекта в функию
Изучаю прогу в универе, понадобилось сделать обьект как аргумент функции.ООП ещё не изучали.Как...

Передача пользовательского обьекта
есть WCF сервис public class SendEmailService : ISendEmailService { public void...

Передача обьекта в атрибут
Встала такаЯ проблема. Есть обьект function robot(name) { this.name=name } var kreg=new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.