4

C# で記述されたいくつかのストアド プロシージャを提供する、SQL Server に統合されたアセンブリを作成しました。アセンブリには、一部の構成データを保持する読み取り専用の静的変数があります。このデータは、アセンブリによって提供されるストアド プロシージャを介して操作されます。明らかに、この静的変数へのアクセスを同期する必要があります。使ってみた

lock(someGuard)
{
    // ... access static configuration
}

私の構成クラス内。しかしその後、HostProtectionException が発生し、それを行うにはアセンブリを完全に信頼して実行する必要があることがわかりました。それを行うより良い方法はありますか?

4

2 に答える 2

7

実際には文書化されていないハックがあります: クラスをCompilerGenerated属性で装飾します。文書化されていない回避策と同様に、マイレージは将来のリリースで異なる可能性があります。

ただし、これは必要ありません。静的が読み取り専用の場合は、読み取り専用として宣言でき、アセンブリは正常に展開されます。読み取り専用の静的は SAFE アセンブリで受け入れられます。そして本当に読み取り専用で、ロックガードも不要です。

読み取り専用のマークを付けてロックを解除できない場合は、読み取り専用ではなく、砂の領域を移動していることを意味します。SQL ワーカーをブロックすると、予測できない結果が生じる可能性があります (したがって、UNSAFE 要件)。CompilerGenerated トリックは、その意味を完全に理解している場合にのみ、十分に注意して使用する必要があります。が必要であるという事実lockは、コードが実際に SQL および静的に対して安全ではないことを示す強力な指標です。

于 2009-08-16T17:23:23.370 に答える
2

この制限を回避する唯一の方法は、アセンブリを UNSAFE として展開することです。それでも、静的共有データは推奨事項に反しています。

SQL Server のマネージ コードのプログラミング モデルには、複数の呼び出しで保持されている状態を使用したり、複数のユーザー セッションで状態を共有したりする必要のない関数、プロシージャ、および型が必要です。さらに、前述のように、共有状態が存在すると、アプリケーションのスケーラビリティと信頼性に影響を与える重大な例外が発生する可能性があります。

これらの考慮事項により、SQL Server は静的変数と静的データ メンバーの使用を許可しません。SAFE および EXTERNAL-ACCESS アセンブリの場合、SQL Server は CREATE ASSEMBLY 時にアセンブリのメタデータを調べ、静的データ メンバーと変数の使用が見つかった場合、そのようなアセンブリの作成に失敗します。

于 2009-08-16T16:28:51.550 に答える