Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 19233|Ответ: 0

[WinForm] Как вызывать методы в C/C++ DLL на C#

[Скопировать ссылку]
Опубликовано 05.02.2015 20:52:39 | | | |

Во-первых, создайте проект DLL на C++



Измените CPPTest.cpp так:

CPPTest.cpp : Определяет точку входа для приложения DLL.
//
#include «stdafx.h»
#include

#ifdef _MANAGED
#pragma справляется (отталкивание, выключение)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpРезервировано
)
{
вернуть TRUE;
}
внешний «C»
{

struct TestStruct
{
int i;
char* str;
};

_declspec(dllexport) size_t __stdcall GetStringLength(char* & str)
{
возвратная strlen(strlen);
}

_declspec(dllexport) int __stdcall AddTwoNumber(const int a,const int b)
{
возврат A+B;
}

_declspec(dllexport) void __stdcall StructTest(TestStruct&s)
{
использование пространства имён std;
cout<<s.i<<endl;
cout<<s.str<<endl;
s.i=54321;
s.str="Они все мертвы!";
}
}

#ifdef _MANAGED
#pragma managed (поп)
#endif


2. Создать тестовый проект на C#


Модифицировать содержание программы на:

используя System;
с использованием System.Collections.Generic;
с использованием System.Text;
с использованием System.Runtime.InteropServices;

Пространство имён ConsoleApplicationTestCSharp
{
Программа класса
{
[DllImport("CPPTest.dll")]
static extern int GetStringLength(ref string str);

[DllImport("CPPTest.dll")]
статический внешний в AddTwoNumber(int a, int b);

[DllImport("CPPTest.dll")]
статический внешний пустотный StructTest (ссылка TestStruct s);

static void Main(string[] args)
{
string testString = «ХАХА! Я — испытательная струна»;

Console.WriteLine("length(C++)=" + GetStringLength(ссылка testString). ToString());
Console.WriteLine("length(C#)=" + testString.Length.ToString());
Console.WriteLine("a+b(C++)=" + AddTwoNumber(10, 1000));
Console.WriteLine("a+b(C#)=" + (10 + 1000));

TestStruct s = новый TestStruct();
s.i = 12345;
s.str = «Стреляй в зло на горах!»;
StructTest(ссылки);
Console.WriteLine(s.i);
Console.WriteLine(s.str);
Console.ReadKey();
}

[StructLayout(LayoutKind.Sequential)]
публичная структура TestStruct
{
Public Int I;
публичная струнная сила;
}
}
}

Обратите внимание на тег DllImportAttribute вышеметод

Результат забега:

length(C++)=24
length(C#)=24
a+b(C++)=1010
a+b(C#)=1010
12345
Идите стрелять в зло на горах!
54321
Они все мертвы!

В-третьих, объяснение нескольких ключевых слов на C/C++

_declspec

__stdcall

экстерн


"C"
(dllexport) экспортирует из DLL с помощью __declspec (dllexport).
</s.str<<endl;
</s.i<<endl;




Предыдущий:Постройте почтовый сервер с помощью Winmail
Следующий:Метод DLL Dynamic State Reference на C# (перепечатка)
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com