P / Invoke และ. NET Target Framework [ซ้ำกัน]
ปัญหานี้ทำให้ฉันขึ้นกำแพง ... แค่พูด
บริษัท ของฉันมีไลบรารี C ++ เดิมและฉันได้รับมอบหมายให้สร้าง. NET wrapper
ฉันไม่มีประสบการณ์ C ++ หรือ P / Invoke ดังนั้นเริ่มต้นด้วยฉันกำลังลองวิธีง่ายๆ
ฉันได้อ่านเอกสารอย่างเป็นทางการแล้วและยังได้พบกับบทช่วยสอนที่ดีอีกด้วย
อย่างไรก็ตามฉันได้ค้นพบว่า. NET Framework เป้าหมายของแอปที่ใช้งานอยู่นั้นสร้างความแตกต่างได้
พี / รหัสวิงวอนจากการกวดวิชาทำงานได้ดี แต่ฉันได้สังเกตเห็นว่าเขามีการกำหนดเป้าหมาย.NET Framework 4 ไคลเอ็นต์โปรไฟล์
ถ้าฉันวางจุดพักมันก็จะถูกโจมตีและทุกอย่างทำงานตามที่คาดไว้หากฉันกำหนดเป้าหมายเฟรมเวิร์กที่สูงกว่า 4 โปรแกรมจะหยุดทำงานโดยไม่มีข้อยกเว้น
ฉันมีวิธีง่ายๆที่กำหนดไว้ใน C ++:
framework.h
extern "C" {
API char* SayHello();
}
dllmain.cpp
char* SayHello() {
return (char*)"Hello";
}
C#
[DllImport("PInvokeTest.dll")]
public static extern string SayHello();
(ฉันได้ลองตั้งค่า CallingConvention และ CharSet บนแอตทริบิวต์ในชุดค่าผสมที่แตกต่างกันฉันได้รับตัวอักษรจีน แต่ไม่มีอะไรทำงานได้สูงกว่า Framework 4
โปรเจ็กต์ C ++ ของฉันมีการAPI=__declspec(dllexport)
ตั้งค่า Preprocessor Definitions และ Calling Convention คือ_stdcall (\Gz)
(ฉันได้ลอง _cdecl ด้วย)
โปรเจ็กต์ C # ทำงานได้ดีบนFramework 4เมื่อฉันเปลี่ยนเป็นอะไรก็ตามที่อยู่เหนือสิ่งนั้นก็จะออกโดยไม่มีข้อยกเว้น
ฉันยังพบDependencies GUIที่แสดงให้ฉันเห็นว่าSayHello
มีอยู่จริง
บริษัท ของเราใช้ 4.6.1 ฉันเจอบทความนี้ซึ่งนำฉันไปสู่PInvokeStackImbalanceแต่นั่นไม่ได้ทำอะไรเลยในกรณีของฉัน
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.
ฉันสามารถสร้าง repo ชั่วคราวของ GitHub ได้หากจำเป็น
คำตอบ
ตอนนี้ฉันรู้แล้วว่ามันเป็นปัญหาเกี่ยวกับสตริงฉันทำการค้นหาเล็กน้อยและฉันพบคำถาม SOนี้
ในที่สุดฉันก็ใช้BSTR
วิธีนี้
BSTR SayHello() {
return ::SysAllocString(L"Hello");
}
[DllImport("DBReplicator.Lib.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string SayHello();
... ยังไม่รู้ว่าฉันจัดการตัวอักษรจีนได้อย่างไร