0

実行時に特定の Web アプリケーションの物理パスを取得するために、SQL Server CLR 内から Microsoft.Web.Administration.dll を使用したいと考えていますが、DLL は SQL Server で使用できないかテストされておらず、追加するには必要になります。依存DLLのチェーンを追加する(これもテストされていない)ため、基本的に上記のすべてを気にしないでください。

問題に移りますが、最初に簡単な背景を説明します。私のデータベース アプリケーションのアーキテクチャは非常に凝っています... "Database.Values" 名前空間 (database.dll 内) には多数の C# クラスが含まれており、それぞれが "RegexConstrainedString" または "ConstrainedNumber" (両方のカスタム クラス) をサブクラス化します。データベース内のさまざまなフィールドの正規表現と数値の制約。各クラスは、各ルールがデータベース内で適用されるテーブル名とフィールド名を示すさまざまなテーブルとフィールド名の組み合わせを指定する属性でマークされます。

展開アプリケーションは、database.dll を取得し、リフレクションを使用して前述の属性を持つクラスを検索し、(IL op コードで) 各クラス (クラス名に "Check" が追加された) の関数を動的に生成します。指定された文字列または数値と関連付けられたクラスを返し、インスタンス化が成功したかどうかに応じて true または false を返します。文字列または数値がクラスの定義された制約と一致しない場合、インスタンス化は失敗します。次に、デプロイ アプリは ILMerge.exe を使用して、動的に生成された関数を元の database.dll とマージし、SQL Server にデプロイされる新しい database.dll を生成します。次に、関連付けられているすべての SQL チェック制約機能をワンクリックで作成、有効化、およびチェックできる GUI を開きます。

とにかく...特に「テキスト」と呼ばれるクラスの1つは、Unicode文字列をASCII文字列にマッピングすることにより、フィールドにASCIIエンコーディングを適用します。完全を期すために、65536個の可能な2バイト(16ビット)UCS2コードポイント値をすべてマッピングしますWeb アプリケーションによって作成および編集される文字マップを使用して、特定の ASCII 文字に変換します。確かに、範囲外 (32 ~ 126) のすべてを疑問符文字にマップすることもできましたが、可能性のあるすべての Unicode 文字を非常によく似た ASCII 文字にマップするところまで、より細かく制御したかったので、おそらく現存する最も完全な (主観的ではありますが) ビジュアル マップの 1 つです。

問題は、SQL CLR の database.dll にある Text クラスの静的コンストラクターが、特定の Web アプリケーションのルートにある ASCII マップ ファイルを読み込む必要があることです。ハードコーディングせずに、また Microsoft.Web.Administration.dll の への呼び出しを使用できずに、そのパスを取得するにはどうすればよいです(new ServerManager()).Sites["Default Web Site"].Applications["/utilities"].VirtualDirectories["/"].PhysicalPathか?

4

2 に答える 2

0

ServerManagerこの情報は、単にクラスをバイパスし、読み取っている同じ構成ファイルを読み取るだけで、かなり簡単に取得できるはずです。チェックしたシステムは IIS 7.0 を実行しており、構成ファイルは次の場所にありました。

C:\Windows\System32\inetsrv\config\applicationHost.config

その XML をロードし、次の行に沿って XQuery 式を使用して、その物理パスを取得します。

(/configuration/system.applicationHost/sites/site[@name="Default Web Site"]/application[@path="/utilities"]/virtualDirectory[@path="/"]/@physicalPath)[1]

質問の次の発言について(特定の要求についてではなく、要求の背景に関連する):

特に「テキスト」と呼ばれるこれらのクラスの 1 つは、Unicode 文字列を ASCII 文字列にマッピングすることにより、フィールドに ASCII エンコーディングを適用します。完全を期すために、65536 の可能な 2 バイト (16 ビット) UCS2 コード ポイント値をすべてマッピングします。

実際には、可能な UCS-2 文字は 65,536 ではありません。UCS-2 には最大で 63,477 文字があります。その数は、2 バイトを使用してから削除した場合の 65,536 の可能な値から得られます。

  • サロゲート ペアを作成するために予約されている 2048 の値 (補助文字の由来)
  • 最後の 2 つの値 (0xFFFE はバイト オーダー マークに使用され、0xFFFF は文字ではありません)
  • 0xFFF0 から 0xFFF8 までの 9 つの値 (未割り当て)
  • 詳細については、0xFFF0 - 0xFFFF の PDF チャートを参照してください。

ただし、、、、NCHARおよび(ただしNVARCHAR、これはもう使用しないでください!) データ型は、実際には完全な UTF-16 エンコーディングを保持できます。名前が で終わらない照合順序を使用すると、組み込み関数が非 UCS-2 文字を正しく解釈できないというだけです(これらは SQL Server 2012 で導入されました)。したがって、XML および接頭辞付きの型に含めることができる文字の真の全範囲は、実際には 1,112,064 コード ポイントです (詳細については、Wikipedia のUTF-16を参照してください)。XMLNTEXT_SCN

于 2015-08-22T06:26:01.050 に答える