Regex.CompileToAssembly如何设置.dll文件位置

时间:2012-04-15 16:51:28

标签: .net regex f#

我在.fsx脚本中试验预编译正则表达式。但我无法弄清楚如何为生成的程序集指定.dll文件位置。我已尝试在CodeBase使用的AssemblyName实例上设置Regex.CompileToAssembly等属性,但无济于事。这就是我所拥有的:

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)

我在FSI执行此操作,当我评估an时,我看到:

> 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;}

但是,我再次看不到 C:\ Users \ Stephen \ Documents \ Visual Studio 2010 \ Projects \ Unquote \ code \ Unquote \ Unquote.Regex.dll 。如果我在我的C盘中搜索 Unquote.Regex.dll ,我会在某个临时AppData文件夹中找到它。

那么,如何正确指定由Regex.CompileToAssembly生成的程序集的.dll文件位置?

1 个答案:

答案 0 :(得分:4)

似乎CompileToAssembly不尊重CodeBase或AssemblyName中的任何其他属性,而只是将结果程序集保存到当前目录。尝试将System.Environment.CurrentDirectory设置为正确的位置,并在保存后将其还原。

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__)