עבור לתוכן

צריך עזרה בשימוש במחלקה של C++ לתוך C#

Featured Replies

פורסם

שלום,

אז ככה, מי שמכיר יש פרוייקט שנקרא LAME שהוא OPEN SOURCE כזה שנכתב ב-C++ שאפשר דרכו להמיר קבצי WAVE ל-MP3. בכל מקרה, אני עובד ב-C# אבל אני רוצה להשתמש בפונקציות של התכנית הזאת.

יצרתי ב-C++ פרוייקט קטן שבו יש את הפונקציות שאני רוצה להשתמש בהם ושמרתי את זה ב-DLL.

השאלה שלי, איך דרך C# אני יכול לשלוח למחלקה הזאת מערך, והתכנית הזאת שבעצם מכינה מהמערך הקיים מערך חדש, תחזיר חזרה ל-C# את המערך החדש.

מישהו יודע איך עושים את הקישור הזה? תודה רבה

פורסם

קודם כל, שנה את הכותרת כך שתכיל קצת יותר מידע (שפות התכנות בהן אתה עובד, הנושא של השאלה).

בעקרון יש שתי דרכים:

1. לעטוף את הקוד ב-++C בפונקציות C פשוטות, ואז לקרוא להן ישירות. יש כאן דוגמה טובה לזה:

http://www.codeguru.com/csharp/csharp/cs_data/article.php/c4217/

המימוש הזה פשוט יותר, ושימושי למקרים שבהם יש לך פונקציה בודדת (ופשוטה) שאתה רוצה לעטוף.

2. לעטוף את הקוד ב-++C בקלאס שהוא ++managed C. קלאס כזה הוא למעשה (כלפי חוץ) קלאס .NET לכל דבר, אבל בפנים מכיל קוד ++C.

פורסם
  • מחבר

אוקיי הוא מוגדר כ-managed כבר, אני רק צריך לדעת איך אני מקשר אותו עם C#.[br]פורסם בתאריך: 14.07.2008 בשעה 20:45:38


אוקיי אני אפרט.... עשיתי לעניין שאני צריך ב-C++ שהוא כבר managed ... עשיתי לו DEBUG לקובץ DLL...

נכנסתי ל-C#, ושם ב-References הוספתי את הקובץ DLL הזה... הקטע שהוא לחלוטין ריק. התווסף לי השם של שלו שם ב-References אבל אין שם כלום חוץ מזה....

וכאן אני חוזר לשאלה שכתובה תגובה אחת לפני - איך אני עושה את הקישור הזה בין C# לקובץ הזה?

ואם להיות יותר ספציפיים, איך אני מעביר לדבר הזה מערך מה-C# ומחזיר אותו

פורסם

איך הגדרת אותו כ-managed? לסמן את הפרוייקט כ-managed זה לא מספיק, צריך לציין שהקלאס עצמו יהיה כזה.

בעקרון אתה צריך להגדיר את הקלאס שלך ככה:

public ref class A {

}

במקום ההגדרה הרגילה:

class A {

}

מעבר לזה, גגל C++/CLI tutorial בשביל מדריכים בנושא.

פורסם
  • מחבר

כן הגדרתי אותו כ-managed, אבל אני מבין שזה לא מספיק...

אוקי שמע, חיפשתי מדריכים אבל אני לא מוצא מסודר שבאמת מסביר לי איך לעשות את מה שאני צריך..

אני די מתחיל בנושאים האלה, אז אולי אני לא מסביר את עצמי כמו שצריך.

אז ככה הנה תמונת מסך מה-C++... את הדבר הזה שאתה רואה, שמוגדר כ-MANAGED, שמרתי כ-DLL.

31139562rf0.jpg

בתמונת מסך הזאת, אפשר לראות איך הוספתי את ה-DLL הזה ולאן הוא התווסף. אני אציין שזה ריק, אין שם כלום במה שצירפתי, ואין לי מושג מה לעשות מפה...

74066472io4.jpg

אני מקווה שיש עכשיו תמונה יותר ספציפית, ואשמח לקבל הסברים ספציפיים איך אני כרגע דרך הC# יוצר קשר עם הDLL הזה..... תודה

פורסם

כמו שאמרתי, אתה צריך לדאוג שהקלאס יהיה public (אחרת הוא פנימי ל-DLL, ואי אפשר יהיה לגשת אליו מבחוץ).

ברגע שתוסיף reference ל-DLL הזה תוכל פשוט להתייחס לקלאס FFT_CPP_CLASS.

בתוך הקוד אתה יכול להשתמש גם בקלאסים של NET. וגם בקלאסים של ++C.

נניח שאתה רוצה להעביר מערך של intים לפונקציה שלך, כלומר טיפוס כזה:

int[] arr;

אז הפונקציה שלך צריכה להיות מוגדרת ככה:

void f(array<int>^ arr)

הסימון ^ אומר שזה בעצם לא קלאס של ++C, אלא טיפוס של NET.

משם אתה רוצה להעביר בעצם מצביע native ישירות לתוך הפונקציה הפנימית. דוגמאות לכך יש כאן:

http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx

(תחת Natively accessing a single-dimensional array)

וכאן:

http://msdn.microsoft.com/en-us/library/1dz8byfh.aspx

קצת יותר מובן עכשיו?

פורסם
  • מחבר

אוקיי כרגע זה התוכן של הקובץ CPP (שממנו ועוד פונקציות עשיתי DLL):

using namespace System;
namespace DLL
{
public ref class FFT_CPP_CLASS
{
public:
static void GetWaveArray(array<int>^ arr)
{

}
};
}

וזה העניין בסי שארפ :

    public void FFT()
{
int[] arr = new int[10];
m_Wavefile = new WaveFile(m_Filename);
FFT_CPP_CLASS.GetWaveArray(arr);
}

בעצם הקוד שנמצא למעלה, הראשון, אמור לקבל את המערך arr שנמצא בקוד השני...

כל מה שאני רוצה זה שהוא יקח את המערך הזה, יאפס אותו ויחזיר אותו מאופס....

איך זה עובד מפה?

פורסם

אתה יכול לרוץ על המערך בדיוק כמו שהיית עושה ב-#C. ההבדל הוא שכיוון ש-arr הוא סוג של מצביע, אתה צריך להתייחס אליו בהתאם, כלומר להשתמש באופרטור <- מתי שאתה ניגש לשדות שלו:

for (int i = 0 ; i < arr->Length ; ++i)
{
arr[i] = 0;
}

אופציה שנייה היא כמו שיש בלינק שנתתי מקודם, שזה לקבל מצביע ישיר (של ++C) למערך, ככה:

pin_ptr<int> p = &arr[0];

ואז להתייחס אליו כמערך ++C לכל דבר (את הגודל של המערך עדיין תצטרך לקבל באמצעות arr->Length).

פורסם
  • מחבר

תודה רבה!!!! הצלחתי...

שאלה קטנה -

יש דרך ב-C# לראות את כל המערכים הקיימים בתכנית במקום מסודר?

פורסם
  • מחבר

טוב יש לי עוד שאלה על אותו פרוייקט אבל אני אפתח נושא חדש כי זה לא קשור

פורסם

תודה רבה!!!! הצלחתי...

שאלה קטנה -

יש דרך ב-C# לראות את כל המערכים הקיימים בתכנית במקום מסודר?

אתה יכול ליצור SINGLETON ולגשת למערכים דרכו.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים