Rowlex와 함께 올빼미 파일에서 어셈블리를 프로그래밍 방식으로 생성합니다

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

  •  21-08-2019
  •  | 
  •  

문제

나는 사용하고있다 Rowlex RDF-S를 처리하는 라이브러리. 내 올빼미 온톨로지에서 C# 헬퍼 클래스 (.NET 어셈블리)를 생성 할 수있는 alwlgrinder.exe라는 DesignTime GUI 도구가 제공됩니다. 런타임에 프로그래밍 방식으로 똑같이 할 수 있는지 아는 사람이 궁금합니다.

도움이 되었습니까?

해결책

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은 어셈블리를 내릴 수 없기 때문에 여기에서 조심해야합니다. 따라서 이전 달리기에서 어셈블리를 제거 할 수 없습니다. 해결책은 새 앱 도메인에서 매번 생성 코드를 실행할 수있는 새로운 앱 도메인에서 실행한다는 것입니다. Owlgrinder.exe는 정확히 이것을합니다. mainform.cs 내부에서 정점에 도달하고 싶을 수도 있습니다.

다른 팁

예, Lame 씨, .net 코드를 프로그래밍 방식으로 생성 할 수 있습니다.

몇 가지 옵션이 있습니다.

  1. 텍스트로 코드를 만듭니다.
    앱 내에서 .CS 또는 .VB 소스 파일을 컴파일 할 수 있습니다. 스타터는 Microsoft.csharp.csharpcodeprovider 클래스의 도움을 참조하십시오. 컴파일러를 프로그래밍 방식으로 호출하여 임베드에 리소스를 지정하고 생성 된 어셈블리를 넣을 위치, 종속성 등을 지정합니다. 여기서 한 가지 시나리오는 Template.cs 파일을 사용하여 코드를 조금 더 포함시킨 다음 컴파일하는 것입니다. 결과는 해당 코드로 인해 어셈블리 (.dll 또는 .exe 또는 .netModule)가 있습니다. 그런 다음 반사를 사용하여 해당 어셈블리를로드하고 호출 할 수 있습니다.

  2. 문서 개체 모델을 사용하여 코드를 만듭니다.
    여기의 관련 기능 영역은 "Codedom"이라고하며 문서 개체 모델이 .NET 코드를 작성하는 데 사용되는 것을 제외하고는 웹 페이지의 HTML DOM과 같이 작동합니다. 프로그래밍 방식으로 DOM 요소를 사용하여 코드를 구성합니다.

코드의 예 :

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