|
Во-первых, создайте проект 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;
|