com — Как вызвать управляемые методы C ++ из неуправляемого переполнения стека

ПОЖАЛУЙСТА, СМОТРИТЕ ОБНОВЛЕНИЕ НИЖЕ

(РЕШЕНО) Также я расширил это во второй вопрос здесь Реализация C # DLL COM-файла в неуправляемой программе C ++

Я исследовал это до конца Интернета, не найдя реального, понятного, человеческого примера того, как это сделать.

У меня есть C # DLL, которая шифрует и дешифрует текст.

Я не хочу / не обладаю интеллектуальной способностью переписать это в неуправляемом коде C ++. Поэтому вместо этого я создал класс C ++ / CLR, который взаимодействует с dll C #.

СЕЙЧАС мне нужно знать, как вызвать управляемый C ++ из моего неуправляемого кода.

Вот мой управляемый код, и он проверен, что он работает

// clrTest.cpp : main project file.

#include "cSharpRiJHarn"#include "stdafx.h"#include <string>
#include <stdio.h>

using namespace cSharpRiJHarn;
using namespace System;String^ Encrypt(String ^s)
{
return  RijndaelLink::encrypt(s);
}String^ Decrypt(String ^s)
{
return  RijndaelLink::decrpyt(s);
}

int main()
{
//Console::WriteLine(Encrypt("It Works"));

//Console::WriteLine(Decrypt(Encrypt("It Works")));

//Console::ReadLine();
return 0;
}

Теперь, когда я снова исследовал это.

Я видел все плохие / слишком сложные объяснения

Я знаю, что мне нужно использовать что-то под названием COM или Interop

Я не знаю, как это работает, и я просто ищу очень простое объяснение.

Спасибо за помощь.

ОБНОВИТЬ

Я превратил C # DLL в COM-файл

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

namespace cSharpRiJHarn
{
[Guid("GuiD CODE REMOVED")]
public interface DBCOM_Interface
{
[DispId(1)]
String encrypt(string s);
[DispId(2)]
String decrpyt(string s);
}

[Guid("GuiD CODE REMOVED"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}

[Guid("GuiD CODE REMOVED"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class RijndaelLink : DBCOM_Interface
{
public String encrypt(String s)
{
return Rijndael.EncryptString(s);
}
public String decrpyt(String s)
{
return Rijndael.DecryptString(s);
}
}
}

Теперь мне просто нужно знать, как реализовать это в неуправляемом C ++ …
Я попытался добавить только файлы в проект C ++, а также добавить весь проект cSharpRiJHarn к этому решению. Ни одна из них не работает.

#import "cSharpRiJHarn"#include "stdafx.h"#include <string>
#include <stdio.h>
#include <iostream>
//using namespace cSharpRiJHarn;int main(){

cSharpRiJHarn::RijndaelLink::encrypt("It works");
char ch;
std::cin>>ch;
return 0;
}

Это одна из ошибок, которые я получаю.

Ошибка 6 ошибка C2653: «cSharpRiJHarn»: не класс или пространство имен
название

а также

Ошибка 8 IntelliSense: не удается открыть исходный файл
«C: /…/…/ Документы / Visual Studio
2010 / Проекты / unmannagedCPPExample / unmannagedCPPExample / Debug / cSharpRiJHarn.tlh «c: …… \ Documents \ visual
студия
2010 \ Projects \ unmannagedcppexample \ unmannagedcppexample \ unmannagedcppexample.cpp

5

Решение

Вы могли бы использовать круто C ++ Marshaling library предоставленный Microsoft, что-то вроде этого:

#include "cSharpRiJHarn"#include "stdafx.h"#include <string>
#include <stdio.h>
#include "msclr\marshal_cppstd.h" // marshaling library

using namespace cSharpRiJHarn;
using namespace System;
using namespace msclr::interop; // marshaling library

std::wstring Encrypt(std::wstring s)
{
return marshal_as<std::wstring>(RijndaelLink::encrypt(marshal_as<String^>(s)));
}

std::wstring Decrypt(std::wstring s)
{
return marshal_as<std::wstring>(RijndaelLink::decrypt(marshal_as<String^>(s)));
}
2

Другие решения

Во-первых, ваши методы получают и возвращают String^ который является управляемым объектом. Неуправляемый код не знает этого типа и не может создать такой объект. Таким образом, вам нужно будет обернуть вызов функции так, чтобы функция упорядочивала управляемый тип в то, что может понять неуправляемый код.

После этого вы можете добавить атрибут DllExport к управляемому методу, как обсуждалось Вот.

0

По вопросам рекламы [email protected]