実行時に特定の 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
か?