สามารถเรียกรหัส C ++ จาก C # ได้หรือไม่?


86

เป็นไปได้หรือไม่ที่จะเรียกรหัส C ++ ซึ่งอาจรวบรวมเป็นไฟล์ไลบรารีโค้ด (.dll) จากภายในภาษา. NET เช่น C #

โดยเฉพาะรหัส C ++ เช่นไลบรารีเครือข่าย RakNet


c ++ ที่ไม่มีการเชื่อมต่อกับ c #: c-sharpcorner.com/uploadfile/tanmayit08/…
Tyler S. Loeper

คำตอบ:


90

วิธีง่ายๆอย่างหนึ่งในการเรียกเข้าสู่ C ++ คือการสร้างชุดตัวห่อใน C ++ / CLI ใน C ++ / CLI คุณสามารถเรียกใช้โค้ดที่ไม่มีการจัดการได้ราวกับว่าคุณกำลังเขียนโค้ดเนทีฟ แต่คุณสามารถเรียกใช้โค้ด C ++ / CLI จาก C # ได้ราวกับว่ามันถูกเขียนด้วย C # โดยพื้นฐานแล้วภาษาได้รับการออกแบบโดยใช้การทำงานร่วมกันในไลบรารีที่มีอยู่เป็น "แอปนักฆ่า"

ตัวอย่างเช่น - รวบรวมสิ่งนี้ด้วยสวิตช์ / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

จากนั้นใน C # ให้เพิ่มการอ้างอิงไปยังแอสเซมบลี ManagedType ของคุณและใช้มันดังนี้:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

ดูบทความในบล็อกนี้เพื่อดูตัวอย่างที่อธิบายเพิ่มเติม


2
ลิงก์ใช้งานไม่ได้สำหรับบทความในบล็อก :(
Vidar

10

P / Invoke เป็นเทคโนโลยีที่ดีและทำงานได้ค่อนข้างดียกเว้นปัญหาในการโหลดไฟล์ DLL เป้าหมาย เราพบว่าวิธีที่ดีที่สุดในการทำสิ่งต่างๆคือการสร้างไลบรารีแบบคงที่ของฟังก์ชันเนทีฟและเชื่อมโยงไปยังโปรเจ็กต์ C ++ ที่มีการจัดการ (หรือ C ++ / CLI) ที่ขึ้นอยู่กับมัน


ฉันมีปัญหากับการโทรกลับและ p / เรียกใช้ การเปลี่ยนไปใช้ C ++ / CLI ช่วยแก้ปัญหาเหล่านี้ได้
MedicineMan

9

ฉันไม่คุ้นเคยกับห้องสมุดที่คุณพูดถึง แต่โดยทั่วไปมีสองวิธีในการดำเนินการดังต่อไปนี้:

  • P / วิงวอนใช้ฟังก์ชันไลบรารีที่ส่งออก
  • การเพิ่มการอ้างอิงไปยังไลบรารีประเภท COM (ในกรณีที่คุณกำลังจัดการกับวัตถุ COM)


2

แน่นอนคือ บทความนี้เป็นตัวอย่างที่ดีของสิ่งที่คุณสามารถทำได้เพื่อเริ่มต้นในเรื่องนี้

เราทำเช่นนี้จาก C # บนอุปกรณ์ Windows Mobile ของเราโดยใช้P / วิงวอน


2

เทคโนโลยีที่ใช้ในการทำเช่นนี้เรียกว่าP / Invoke ; คุณสามารถค้นหาบทความเกี่ยวกับเรื่องนี้ โปรดทราบว่ามีไว้สำหรับการเรียก C จาก C # ไม่ใช่ C ++ มากนัก ดังนั้นคุณจะต้องห่อรหัส C ++ ของคุณใน C wrapper ที่ DLL ของคุณส่งออก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.