|
По-перше, створіть проєкт 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; чар* силу; }; _declspec(dllexport) size_t __stdcall GetStringLength(char* & str)
{ повернення strlen(stren);
} _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; простор назв 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(reference 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 довжина(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;
|