استدعاء التعليمات البرمجية المدارة من التعليمات البرمجية غير المدارة

StackOverflow https://stackoverflow.com/questions/225277

  •  03-07-2019
  •  | 
  •  

سؤال

أريد أن أتصل .صافي رمز من غير مدارة 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)

ونلقي نظرة على GCHandle الصف والكلمة gcroot، والتي توفر typesafe، قالب التفاف حول GCHandle.

ويمكنك استخدام هذه لعقد إشارة إلى كائن CLR (أو قيمة محاصر) في التعليمات البرمجية الأصلية.

وMSDN لديه البرنامج التعليمي هنا .

وأعتقد كنت تبحث عن عكس PInvoke. إذا كنت جوجل لpinvoke العكسي ستحصل على الكثير من مقالات مفيدة. أعتقد أن يلي لديه مثال سريع وقذرة جيد.

PInvoke -Reverse PInvoke و__stdcall - __cdecl

ورمز الهاتف الخاص بك هو C ++ مع / مسح تمكين. حق؟

وإذا كانت الإجابة بنعم، ثم يمكنك ببساطة استخدام العبارة باستخدام لاستخدام دلل NET الخاص بك في التعليمات البرمجية. شيء من هذا القبيل:

#using <Mydll.dll>

وبعد ذلك يمكنك ببساطة جعل الكائنات من الطبقات المدارة مثل:

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

إذا كنت تريد أن تجعل هذه الكائنات عضو بيانات صفك للgcroot باستخدام هو الطريق للذهاب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top