P / Invoke และ. NET Target Framework [ซ้ำกัน]

Jan 22 2021

ปัญหานี้ทำให้ฉันขึ้นกำแพง ... แค่พูด

บริษัท ของฉันมีไลบรารี 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 ได้หากจำเป็น

คำตอบ

LukeTO'Brien Jan 22 2021 at 19:50

ตอนนี้ฉันรู้แล้วว่ามันเป็นปัญหาเกี่ยวกับสตริงฉันทำการค้นหาเล็กน้อยและฉันพบคำถาม SOนี้
ในที่สุดฉันก็ใช้BSTRวิธีนี้

BSTR SayHello() {
    return ::SysAllocString(L"Hello");
}
        [DllImport("DBReplicator.Lib.dll")]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static extern string SayHello();

... ยังไม่รู้ว่าฉันจัดการตัวอักษรจีนได้อย่างไร