استدعاء التعليمات البرمجية المدارة من التعليمات البرمجية غير المدارة
سؤال
أريد أن أتصل .صافي رمز من غير مدارة C++.بلدي عملية entrypoint هو .صافي أساس لذلك لا داعي للقلق حول استضافة CLR.وأنا أعلم أنه يمكن أن يتم ذلك باستخدام COM wrappers .صافي الكائنات ، ولكن أود أن وصول الفرد أساليب ثابتة تمكن الطبقات ، لذلك COM ليست أقصر/أسهل طريق.
وذلك بفضل!
المحلول
وعلى افتراض كنت تتحدث عن التعليمات البرمجية غير المدارة الحقيقي - وليس فقط الأصلي C ++ قيد التشغيل في التجمع وضع مختلط ترجمة مع / مسح - أسهل طريقة لإنشاء المجمع إلى رمز NET الخاص بك في C ++ / CLI. يمكنك ثم تصدير أساليب C ++ / CLI فقط عن طريق وضع العلامات عليها مع __declspec (dllexport).
وبدلا من ذلك، إذا كان لديك السيطرة على الاحتجاج من التعليمات البرمجية غير المدارة، يمكنك تعبئة الوظائف مؤشرات إلى أساليب NET الخاص بك وتمريرها إلى التعليمات البرمجية غير المدارة.
نصائح أخرى
انظر إلى هذا الحل:https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports الحل يسمح للاتصال C# وظيفة من C من خلال تزيين الخاص بك مع وظيفة [DllExport] سمة (عكس P/استدعاء DllImport).
حصول exmaple:
التعليمات البرمجية C#
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
ج كود:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
الإخراج:
The solution is found!!! Z is 15
التحديث:هناك سؤال و إجابة جيدة في التعليقات:
كيف يمكنني تشمل dll في غير المدارة المشروع ؟
عليك أن تصل إلى .ليب الملف الذي تم إنشاؤه عند تجميع الخاص بك التعليمات البرمجية C# (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)
وأعتقد كنت تبحث عن عكس PInvoke. إذا كنت جوجل لpinvoke العكسي ستحصل على الكثير من مقالات مفيدة. أعتقد أن يلي لديه مثال سريع وقذرة جيد.
ورمز الهاتف الخاص بك هو C ++ مع / مسح تمكين. حق؟
وإذا كانت الإجابة بنعم، ثم يمكنك ببساطة استخدام العبارة باستخدام لاستخدام دلل NET الخاص بك في التعليمات البرمجية. شيء من هذا القبيل:
#using <Mydll.dll>
وبعد ذلك يمكنك ببساطة جعل الكائنات من الطبقات المدارة مثل:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
إذا كنت تريد أن تجعل هذه الكائنات عضو بيانات صفك للgcroot باستخدام هو الطريق للذهاب.