2

.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フォルダーにあります。

では、どうすればによって生成されたアセンブリの.dllファイルの場所を正しく指定できますRegex.CompileToAssemblyか?

4

1 に答える 1

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__)
于 2012-04-15T17:01:50.917 に答える