سؤال

أحاول كتابة DLL باستخدام C# .NET Framework 2.0. كل شيء يجمع بشكل جيد ، ولكن عندما أحاول الوصول إلى DLL من طلبي ، فإنه يفشل عند محاولة الحصول على عنوان الإجراء. لذلك ، قمت باختيار DLL في Walker التبعية ، وجميع وظائفي العامة مفقودة!

DLL الخاص بي ، حتى الآن ، واضح إلى حد ما:

namespace MyDll_Namespace
{
    public class MyDllClass
    {
        public static int Func1( /* params */ ) { /* ... */ }

        public static int Func2( /* params */ ) { /* ... */ }

        public static int Func3( /* params */ ) { /* ... */ }

        public static int Func4( /* params */ ) { /* ... */ }
    }
}

ليس هناك الكثير ، فقط عدد قليل من الثوابت والمندوبين المحددة داخل الفصل ، وكذلك خارج الفصل في مساحة الاسم. أي أفكار أو اقتراحات ستكون موضع تقدير كبير. شكرًا.

نصائح أخرى

Walker التبعية مخصص لـ Win32 DLLs (وهو الكود المحلي) ، وليس .NET التجميعات (وهو رمز مُدار). لن يجد طرقًا في فئة تعسفية (حتى لو كانت ثابتة). إذا كنت بحاجة إلى استدعاء التعليمات البرمجية المدارة من الكود الأصلي ، فهناك طرق للقيام بذلك ، لكنها ليست جميلة.

إذا كنت ترغب في استخدام DLL الخاص بك من التعليمات البرمجية المدارة ، فسيكون الأمر أسهل كثيرًا. الدفع system.assembly و المنشط.

مثال على هذا:

var assembly = Assembly.LoadFile(@"\path\to\your.dll");
var mydllclass_type = assembly.GetType("MyDllClass");
var instance = Activator.CreateInstance(mydllclass_type);

سيكون المثيل كائنًا. لاستدعاء الأساليب ، تحتاج إلى استخدام التفكير ، لأن الواجهة غير معروفة في وقت الترجمة.

إذا كنت تقوم بإنشاء نظام إضافي ، فإن أفضل طريقة هي أن يكون لديك واجهة أو قاعدة مجردة لجميع المكونات الإضافية ، وتلك المشار إليها في البرنامج. هذه الأطراف الثالثة التي تنفذ البرنامج المساعد ، سوف يشيرون أيضًا إلى هذا العقد. في هذه الحالة ، يتغير السطر الأخير قليلاً:

var instance = (IMyDllClass)Activator.CreateInstance(mydllclass_type);

الآن يمكنك استخدام الأساليب كما في كائن تم إنشاؤه بانتظام.

جزء من المشكلة هنا هو أن Walker التبعية هي أداة للتطبيقات الأصلية. إنه لا يفهم التعليمات البرمجية المدارة ، وبالتالي لن يعرض أيًا من الأنواع المدارة + الطرق التي حددتها.

أنا مرتبك من هذا الخط في سؤالك

عندما أحاول الوصول إلى DLL من طلبي ، فإنه يفشل عند محاولة الحصول على عنوان الإجراء

هذا يبدو وكأنه خطأ أراه في تطبيق أصلي ، وليس تطبيقًا مُدارًا. هل تحاول الوصول إلى رمز C# من تطبيق أصلي؟ إذا كان الأمر كذلك ، فلا يمكن القيام بذلك إلا عبر com Magic وليس عن طريق الاتصال المباشر. هل يمكن أن تشرح بمزيد من التفصيل ما الذي يحدث هنا؟

جرب .NET Reflector لمعرفة ما هو بالضبط داخل DLL المبني (للتأكد من أن كل شيء هو الطريقة التي يفترض بها). تأكد أيضًا من أنك في وضع الإصدار أثناء إنشاء DLL الخاص بك قبل الرجوع إليه ... لا أعرف ما إذا كان سيغير أي شيء ، لكنه يستحق المحاولة =)

تحتاج إلى إضافة مرجع إلى DLL الخاص بك وسيسمح لك وقت التشغيل تلقائيًا بالاتصال بوظيفتك. هنا قليلا درس تعليمي على كتابة مكتبة فئة .NET.

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