Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 19233|Отговор: 0

[WinForm] Как да извикваме методи в C/C++ DLLs в C#

[Копирай линк]
Публикувано в 5.02.2015 г. 20:52:39 ч. | | | |

Първо, създайте проект за C++ DLL



Променете 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
{
интелект i;
char* str;
};

_declspec(dllexport) size_t __stdcall GetStringLength(char* & str)
{
return 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 управлявана (поп)
#endif


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


Модифицирайте съдържанието на програмата до:

използвайки System;
използвайки System.Collections.Generic;
използвайки System.Text;
използвайки System.Runtime.InteropServices;

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

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

[DllImport("CPPTest.dll")]
static extern void StructTest (ref TestStruct s);

static void Main(string[] args)
{
string testString = "ХАХА! Аз съм тестова струна";

Console.WriteLine("length(C++)=" + GetStringLength(ref 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(ref s);
Console.WriteLine(s.i);
Console.WriteLine(s.str);
Console.ReadKey();
}

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

Обърнете внимание на тагa DllImportAttribute по-гореметод

Резултат от бягането:

length(C++)=24
дължина(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 референция на динамично състояние на C# (Препечатване)
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com