Программное создание сборок из файлов OWL с помощью ROWLEX.

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

  •  21-08-2019
  •  | 
  •  

Вопрос

Я использовал РОУЛЕКС библиотека для обработки RDF-ов.Он поставляется с инструментом графического пользовательского интерфейса времени разработки под названием 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 поддерживает все, что поддерживает язык.Вы можете создавать лямбда-выражения и выражения linq, условные выражения и поток управления, что угодно.

Затем вы можете скомпилировать этот класс и снова создать сборку, которую можно сохранить на диске или в памяти и динамически загружать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top