|
Pirmiausia sukurkite C++ DLL projektą
Pakeisti CPPTest.cpp taip: CPPTest.cpp : apibrėžia DLL programos įėjimo tašką.
// #include "stdafx.h" #include #ifdef _MANAGED #pragma valdomas (stumti, išjungti) #endif BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved
)
{ grąžinti TRUE;
} išorinis "C"
{ struct TestStruct
{ int i; char* str; }; _declspec(dllexport) size_t __stdcall GetStringLength(char* & str)
{ grąžinti strlen(str);
} _declspec(dllexport) int __stdcall AddTwoNumber(const int a,const int b)
{ grąžinti A+B;
} _declspec(dllexport) void __stdcall StructTest(TestStruct& s)
{ vardų srities STD naudojimas; cout<<s.i<<endl; cout<<s.str<<endl; s.i=54321; s.str="Jie visi mirę!";
}
} #ifdef _MANAGED #pragma valdomas (pop) #endif
2. Sukurkite C# testavimo projektą
Modifikuokite programos turinį, kad: naudojantis Sistema; naudojant System.Collections.Generic; naudojant System.Text; naudojant System.Runtime.InteropServices; vardų sritis ConsoleApplicationTestCSharp
{ klasės programa
{ [DllImport("CPPTest.dll")] statinis extern int GetStringLength(ref string str); [DllImport("CPPTest.dll")] statinis išorinis int AddTwoNumber(int a, int b); [DllImport("CPPTest.dll")] statinė išorinė tuščia StructTest(nuoroda TestStruct s); static void Main(string[] args)
{ string testString = "HAHA! Aš esu bandomoji styga"; 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 = naujas TestStruct(); s.i = 12345; s.str = "Eik šaudyti blogybių ant kalnų!"; StructTest(nuoroda); Console.WriteLine(s.i); Console.WriteLine(s.str); Console.ReadKey();
} [StructLayout(LayoutKind.Sequential)] viešoji struktūra TestStruct
{ viešasis int i; viešoji styga str;
}
}
} Atkreipkite dėmesį į aukščiau pateiktą žymę DllImportAttributemetodas。 Vykdymo rezultatas: ilgis (C++)=24 ilgis (C#) = 24 a+b(C++)=1010 a+b(C#)=1010
12345 Eik šaudyti blogybių ant kalnų!
54321 Jie visi mirę! Trečia, kelių raktinių žodžių paaiškinimas C/C++ _declspec __stdcall išorinis
"C" (DLLEXPORT) eksportuoja iš DLL naudojant __declspec (dllexport). </s.str<<endl; </s.i<<endl;
|