إنشاء تجميعات برمجيًا من ملفات OWL باستخدام ROWLEX

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

  •  21-08-2019
  •  | 
  •  

سؤال

لقد تم استخدام رولكس مكتبة للتعامل مع RDF-s.يتم شحنه مع أداة واجهة المستخدم الرسومية الخاصة بوقت التصميم والتي تسمى OwlGrinder.exe والتي يمكنها إنشاء فئات مساعد C# (تجميعات .NET على وجه الدقة) من أنطولوجيات OWL الخاصة بي.أتساءل عما إذا كان أي شخص يعرف ما إذا كان بإمكاني فعل الشيء نفسه برمجيًا في وقت التشغيل.

هل كانت مفيدة؟

المحلول

وROWLEX أصبح مجرد مفتوحة المصدر، وحتى الآن لديك الفرصة لننظر في الواقع داخل رمز من OwlGrinder.exe ونسخ رمز من هناك. ومع ذلك، وهنا هو مثال قصيرة:

    private NC3A.SI.Rowlex.AssemblyGenerator generator;

    private void RunAssemblyGeneration(XmlDocument ontologyFileInRdfXml)
    {
        this.generator = new NC3A.SI.Rowlex.AssemblyGenerator();
        this.generator.GenerateAsync(ontologyFileInRdfXml, "myAssemblyName", 
                                        null, this.OnGenerationFinished);
    }

    private void OnGenerationFinished(string errorMessage)
    {
        if (errorMessage == null)
        {
            // Success
            // Displaying warnings and saving result
            string[] warnings = this.generator.Warnings;
            this.generator.SaveResult(@"C:\myAssemblyName.dll");
                // Important! One generator instance can be executed only once. 
                this.generator = null; 
                this.RejoiceOverSuccess();
            }
        else
        {
                // Failure
                this.MournOverFailure();
            }

    }

إذا كنت تريد توليد التجميعات في وقت التشغيل، وأفترض أنك قد ترغب في تكرار ذلك مرارا وتكرارا عن المطالب المستخدم الخاص بك. لديك لمشاهدة هنا، لأن .NET لا تسمح لك لتفريغ جمعية. لذلك لا يمكنك التخلص من التجميعات من يدير السابقة. الحل هو أن تقوم بتنفيذ رمز جيل في كل مرة في AppDomain الجديد الذي يمكن تفريغها. OwlGrinder.exe لا بالضبط هذا، قد ترغب في ذروتها داخل MainForm.cs

نصائح أخرى

نعم، سيد لامي، يمكنك إنشاء كود .NET برمجيًا.

هناك خياران.

  1. قم بإنشاء الكود كنص.
    يمكنك تجميع أي ملف مصدر بتنسيق .cs أو .vb من داخل التطبيق.راجع التعليمات الخاصة بفئة Microsoft.CSharp.CSharpCodeProvider كبداية.يمكنك استدعاء المترجم برمجيًا، وتحديد الموارد المراد تضمينها، ومكان وضع التجميع الذي تم إنشاؤه، والتبعيات، وما إلى ذلك.أحد السيناريوهات هنا هو استخدام ملف template.cs، وتضمين المزيد من التعليمات البرمجية فيه، ثم تجميعه.والنتيجة هي تجميع (.dll أو .exe أو .netmodule إذا أردت) الناتج عن هذا الرمز.يمكنك بعد ذلك تحميل هذا التجميع واستدعاءه باستخدام الانعكاس.

  2. قم بإنشاء التعليمات البرمجية باستخدام نموذج كائن المستند.
    تسمى منطقة الميزات ذات الصلة هنا "CodeDom" وهي تعمل مثل HTML DOM لصفحات الويب، باستثناء نموذج كائن المستند الذي يتم استخدامه لإنشاء كود .NET.برمجيًا، يمكنك إنشاء التعليمات البرمجية باستخدام عناصر DOM.

مثال على شيء CodeDom:

var class1 = new System.CodeDom.CodeTypeDeclaration(className);
class1.IsClass=true;
class1.TypeAttributes = System.Reflection.TypeAttributes.Public;
class1.Comments.Add(new System.CodeDom.CodeCommentStatement("This class has been programmatically generated"));
// add a constructor to the class
var ctor= new System.CodeDom.CodeConstructor();
ctor.Attributes = System.CodeDom.MemberAttributes.Public;
ctor.Comments.Add(new System.CodeDom.CodeCommentStatement("the null constructor"));
class1.Members.Add(ctor);

// add one statement to the ctor:  an assignment
// in code it will look like;  _privateField = new Foo(); 
ctor.Statements.Add(new System.CodeDom.CodeAssignStatement(new System.CodeDom.CodeVariableReferenceExpression("_privateField"), new System.CodeDom.CodeObjectCreateExpression(fooType)));


// include a private field into the class
System.CodeDom.CodeMemberField field1;
field1= new System.CodeDom.CodeMemberField();
field1.Attributes = System.CodeDom.MemberAttributes.Private;
field1.Name= "_privateField";
field1.Type=new System.CodeDom.CodeTypeReference(fooType);
class1.Members.Add(field1);

الخ الخيمكنك إضافة طرق عادية، وجميع أنواع البيانات في التعليمات البرمجية، وما إلى ذلك.AFAIK تدعم عناصر CodeDom كل ما تدعمه اللغة.يمكنك القيام بتعبيرات lambdas و linq والشروط وتدفق التحكم وأي شيء.

يمكنك بعد ذلك تجميع تلك الفئة، وإنتاج تجميع يمكنك حفظه على القرص أو الاحتفاظ به في الذاكرة وتحميله ديناميكيًا مرة أخرى.

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