ฉันเพิ่งทำงานในโปรเจ็กต์ที่ใช้ dll ของ vc แต่จำเป็นต้องเรียกใช้ใน .net ฉันศึกษาวิธีการเรียก dll ที่ไม่มีการจัดการใน c#
ก่อนอื่นเรามาแนะนำไฟล์ dll กันก่อน
ไฟล์ 1.Dll
ไลบรารีลิงก์แบบไดนามิก (เรียกอีกอย่างว่า DLL ย่อมาจาก "Dynamic Link Library") เป็นหนึ่งในองค์ประกอบที่สำคัญที่สุดของ Microsoft Windows เปิดโฟลเดอร์ระบบ Windows แล้วคุณจะพบว่ามีไฟล์ DLL จำนวนมากในโฟลเดอร์ Windows คือบางส่วน ฟังก์ชันระบบหลักๆ จะถูกนำไปใช้ในรูปแบบของโมดูล DLL
ไลบรารีลิงก์แบบไดนามิกไม่สามารถดำเนินการได้โดยตรงและไม่สามารถรับข้อความได้ มันเป็นเพียงไฟล์อิสระที่มีฟังก์ชัน (วิธีการ) ที่โปรแกรมหรือ DLL อื่น ๆ สามารถเรียกใช้เพื่อดำเนินการบางอย่างให้เสร็จสิ้นได้ ) แต่ฟังก์ชันเหล่านี้ไม่ได้เป็นส่วนหนึ่งของโปรแกรมดำเนินการ แต่โหลดตามความต้องการตามความต้องการของกระบวนการ และขณะนี้สามารถมีบทบาทได้เท่านั้น
DLL จะถูกโหลดลงในพื้นที่เสมือนของกระบวนการโดยระบบเฉพาะเมื่อแอปพลิเคชันต้องการ และกลายเป็นส่วนหนึ่งของกระบวนการเรียก ในขณะนี้ DLL สามารถเข้าถึงได้โดยเธรดของกระบวนการเท่านั้น และหมายเลขอ้างอิงของ DLL นั้นสามารถเข้าถึงได้ ถูกใช้โดยกระบวนการเรียก และกระบวนการเรียก DLL ยังสามารถใช้หมายเลขอ้างอิงกระบวนการได้อีกด้วย ในหน่วยความจำ DLL มีเพียงอินสแตนซ์เดียว และการจัดเตรียมไม่เกี่ยวข้องกับภาษาโปรแกรมและคอมไพเลอร์เฉพาะ ดังนั้นการเขียนโปรแกรมภาษาผสมจึงสามารถทำได้ผ่าน DLL วัตถุใดๆ (รวมถึงตัวแปร) ที่สร้างขึ้นโดยโค้ดภายในฟังก์ชัน DLL จะเป็นเจ้าของโดยเธรดหรือกระบวนการที่เรียกใช้วัตถุนั้น
2. การเรียก DLL
ภาษาการเขียนโปรแกรมแต่ละภาษามีวิธีเรียก DLL ที่แตกต่างกัน ที่นี่เราจะแนะนำวิธีการเรียก DLL โดยใช้ C# เท่านั้น ขั้นแรก คุณต้องทำความเข้าใจว่าอะไรได้รับการจัดการและอะไรไม่ได้รับการจัดการ โดยทั่วไป อาจคิดได้ว่าโค้ดที่ไม่มีการจัดการส่วนใหญ่จะเป็นส่วนประกอบ DLL และ ActiveX ที่พัฒนาบนแพลตฟอร์ม win 32 ในขณะที่โค้ดที่ได้รับการจัดการได้รับการพัฒนาบนแพลตฟอร์ม .net
(1) วิธีการทั่วไปในการเรียกใช้ฟังก์ชันที่ไม่มีการจัดการใน DLL
ขั้นแรก ควรประกาศวิธีการภายนอกในโปรแกรมต้นฉบับภาษา C#
[DLLImport("ไฟล์ DLL")]
ตัวแก้ไขภายนอกส่งคืนชื่อวิธีการประเภทตัวแปร (รายการพารามิเตอร์)
ใน:
ไฟล์ DLL: มีไฟล์ไลบรารีที่กำหนดวิธีการภายนอก
ตัวดัดแปลง: ตัวดัดแปลงการเข้าถึง ตัวดัดแปลงอื่นที่ไม่ใช่นามธรรมที่สามารถใช้เมื่อประกาศวิธีการ
ประเภทตัวแปรส่งคืน: ประเภทตัวแปรส่งคืนของวิธีการที่คุณต้องการเรียกใช้ในไฟล์ DLL
ชื่อวิธีการ: ชื่อของวิธีการที่คุณต้องการเรียกใช้ในไฟล์ DLL
รายการพารามิเตอร์: รายการวิธีการที่คุณต้องเรียกใช้ในไฟล์ DLL
หมายเหตุ: จำเป็นต้องใช้เนมสเปซ System.Runtime.InteropServices ในการประกาศโปรแกรม
DllImport สามารถวางได้เฉพาะในการประกาศวิธีการเท่านั้น
ไฟล์ DLL จะต้องอยู่ในไดเรกทอรีปัจจุบันของโปรแกรมหรือเส้นทางการสืบค้นที่กำหนดโดยระบบ (เช่น: เส้นทางที่กำหนดโดยเส้นทางในตัวแปรสภาพแวดล้อมของระบบ)
ประเภทตัวแปรส่งคืน ชื่อเมธอด และรายการพารามิเตอร์ต้องสอดคล้องกับคำจำกัดความในไฟล์ DLL
ถ้าคุณต้องการใช้ชื่อฟังก์ชันอื่นๆ คุณสามารถใช้การตั้งค่าคุณสมบัติ EntryPoint เช่น:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
int MsgBox ภายนอกแบบคงที่ (int hWnd, ข้อความสตริง, คำอธิบายสตริง, ประเภท int);
แอตทริบิวต์ DllImportAttribute ทางเลือกอื่นๆ:
CharSet ระบุชุดอักขระที่ใช้ในจุดเริ่มต้น เช่น CharSet=CharSet.Ansi;
SetLastError บ่งชี้ว่าวิธีการเก็บ Win32 "ข้อผิดพลาดล่าสุด" เช่น: SetLastError=true;
ExactSpelling บ่งชี้ว่า EntryPoint ต้องตรงกับการสะกดของจุดเริ่มต้นที่ระบุทุกประการหรือไม่ เช่น ExactSpelling=false;
PreserveSig ระบุว่าควรรักษาหรือแปลงลายเซ็นของวิธีการ เช่น: PreserveSig=true;
CallingConvention ระบุรูปแบบการเรียกของจุดเริ่มต้น เช่น: CallingConvention=CallingConvention.Winapi;