2012-04-15 5 views
2

Ich experimentiere mit Precompile Regexes in einem .fsx-Skript. Aber ich kann nicht herausfinden, wie der Speicherort der DLL-Datei für die generierte Assembly angegeben wird. Ich habe versucht, Eigenschaften wie CodeBase auf der AssemblyName Instanz zu setzen, die von Regex.CompileToAssembly verwendet wird, aber ohne Erfolg. Hier ist, was ich habe:Regex.CompileToAssembly wie Speicherort der DLL-Datei festlegen

open System.Text.RegularExpressions 

let rcis = [| 
    new RegexCompilationInfo(
     @"^NumericLiteral([QRZING])$", 
     RegexOptions.None, 
     "NumericLiteral", 
     "Swensen.Unquote.Regex", 
     true 
    ); 
|] 

let an = new System.Reflection.AssemblyName("Unquote.Regex"); 
an.CodeBase <- __SOURCE_DIRECTORY__ + "\\" + "Unquote.Regex.dll" 
Regex.CompileToAssembly(rcis, an) 

ich dies in FSI Ausführung und als ich an bewerten Ich sehe:

> an;; 
val it : System.Reflection.AssemblyName = 
    Unquote.Regex 
    {CodeBase = "C:\Users\Stephen\Documents\Visual Studio 2010\Projects\Unquote\code\Unquote\Unquote.Regex.dll"; 
    CultureInfo = null; 
    EscapedCodeBase = "C:%5CUsers%5CStephen%5CDocuments%5CVisual%20Studio%202010%5CProjects%5CUnquote%5Ccode%5CUnquote%5CUnquote.Regex.dll"; 
    Flags = None; 
    FullName = "Unquote.Regex"; 
    HashAlgorithm = None; 
    KeyPair = null; 
    Name = "Unquote.Regex"; 
    ProcessorArchitecture = None; 
    Version = null; 
    VersionCompatibility = SameMachine;} 

Aber noch einmal, ich sehe nicht C: \ Benutzer \ Stephen \ Dokumente \ Visual Studio 2010 \ Projekte \ Unquote \ Code \ Unquote \ Unquote.Regex.dll wie ich möchte. Wenn ich mein C-Laufwerk nach Unquote.Regex.dll suche, finde ich es in einem temporären AppData-Ordner.

Also, wie kann ich den Speicherort der DLL-Datei für eine Assembly ordnungsgemäß von Regex.CompileToAssembly generiert angeben?

Antwort

4

Scheint, dass CompileToAssembly CodeBase oder jede andere Eigenschaft in AssemblyName nicht respektiert und stattdessen Ergebnis Assembly nur in dem aktuellen Verzeichnis speichert. Versuchen Sie, System.Environment.CurrentDirectory auf den richtigen Speicherort festzulegen und es nach dem Speichern zurückzusetzen.

open System.Text.RegularExpressions 

type Regex with 
    static member CompileToAssembly(rcis, an, targetFolder) = 
     let current = System.Environment.CurrentDirectory 
     System.Environment.CurrentDirectory <- targetFolder 
     try 
      Regex.CompileToAssembly(rcis, an) 
     finally 
      System.Environment.CurrentDirectory <- current 


let rcis = [| 
    new RegexCompilationInfo(
     @"^NumericLiteral([QRZING])$", 
     RegexOptions.None, 
     "NumericLiteral", 
     "Swensen.Unquote.Regex", 
     true 
    ); 
|] 

let an = new System.Reflection.AssemblyName("Unquote.Regex"); 
Regex.CompileToAssembly(rcis, an, __SOURCE_DIRECTORY__) 
+0

Ausgezeichnet - danke! –

Verwandte Themen