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