none
החלפת פונקציות ב Run Time RRS feed

  • שאלה

  • היי

    הפיתוח הוא ב dot.net 3.5 על win7&xp.

    יש לי מסך עם 3 שדות שדה A שדה B ושדה Result וכפתור Compute.

    יש לי שני DLL-ים שיהיה לי קשה לבצע בהם שינויים.

    השמות של שניהם זהים compute.dll.

    בתוך ה DLL הראשון יש פונקציית compute result=a+b.

    בתוך ה dll השני יש פונקציית compute result=a*b (הבדל הוא באופרטור בין השדות אחד הוא פלוס והשני כפול).

    אני רוצה לשים את המסך בספריה c:\screen

    אני רוצה לשים את ה DLL-ים בספריית c:\screen\compute.

    בזמן ריצה אני רוצה לשים בספריית c:\screen\compute את ה dll הראשון ולאחר מכן בזמני החופשי למחוק את הראשון ולשים את השני. הדגש הוא על זמן ריצה.

    מה צריך לעשות / להגדיר כדי שהתסריט הזה יעבוד?

    תודה

    מושיק

    יום שישי 06 אוקטובר 2017 06:12

כל התגובות

  • נתחיל מהסוף

    אתה יכול בזמן ריצה לייבא לתוכנית ספריות DLL ולעבוד איתן באמצעות רפלקציה (Reflection)

    העקרון הוא כך:

    שלב 1: מייבאים את הקובץ באמצעות
    Assembly.LoadFile

    שלב 2: ניתן לחקור את הספרייה דינאמית ולחפש מחלקה מסויימת באמצעות המתודה:
    GetType

    או לבצע לולאה על כל המחלקות הפתוחות (Public) שיש בספרייה באמצעות
    GetExportedTypes

    אחרי שמצאת את המחלקה המתאימה אפשר לעבוד עם המתודות שיש המחלקה בעזרת
    Activator.CreateInstance

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

    class Program
    {
        static void Main(string[] args)
        {
            // We import the file by location
    		var MyImportedDLL = Assembly.LoadFile(@"C:\RonenArielyTest\ExternalDLL.dll");
    		// We can use "Assembly.LoadFrom" for DLL in the bin folder for example, without path
    		
    		// we define the class name MyExternalClass 
    		//Which is inside the external file inside the Namespace MyExternalNamespace
    		// The result is type "Type" but simpler tlo use "var"
            var MyImportedType = MyImportedDLL.GetType("MyExternalNamespace.MyExternalClass");
    		
    		// Creates an instance of that class
    		// Makes a connection between our library/class and the main program
            var MyClassInstance = Activator.CreateInstance(MyImportedType);
    		
    		// Now we can define a specific method if we know the name, or use "MyImportedType.GetMethods()" to get array of all methods
            var MyImportedMethod = MyImportedType.GetMethod("MyExternalMethod");
    		
    		// and we can invoke the method 
    		// Assuming the method get a single string parameter
    		// This will execute the external method
            MyImportedMethod.Invoke(MyClassInstance, new object[]{@"MyParamValue"});
    		
    		// If the external method retuen something we can import the return valu to pafameter
    		// It is importamt to make sure the type that returns is correct.
    		// Before using the value use CONVERT
    		bool MyReturnedValue = Convert.ToBoolean(
    			MyImportedMethod.Invoke(MyClassInstance, new object[]{@"MyParamValue"})
    		);
    		
            Console.ReadLine();
        }
    }

    * אני ממליץ לחפש עוד חומר בגוגל על ידי חיפוש צירוף המילים הבא:
    c# import dll

    * דרך אגב אפשר גם לייבא ספריות קוד שכתובות בטכנולוגיות אחרות כמו בשפת C באמצעות DllImport

    ** הערה: לא בדקתי את הקוד על ידי הרצה, אני מקווה שאין לי טעות קטנה בדרך, אבל זה הרעיון בכל מקרה (כמובן שיש עוד אפשרויות)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]



    יום שישי 06 אוקטובר 2017 08:30
    מנחה דיון