3

私は、Visual Studio 2008 で次の 2 種類の Web プロジェクトを認識しています。

  • ウェブサイト プロジェクト
  • Web アプリケーション プロジェクト

Web アプリケーション プロジェクトは、Web アプリケーションのアセンブリも同じキーで署名されている限り、署名されたアセンブリを参照できます。ただし、アセンブリに署名する場所がないため、これは Web サイト プロジェクトでは機能しません。これは、アセンブリがサーバー上で動的にコンパイルされるためだと思いますか?

とにかく、この署名されたアセンブリで Web サイト プロジェクトを動作させることは可能ですか? または、この Web サイト プロジェクトを Web アプリケーション プロジェクトに変換する必要がありますか?

編集:

以下の状況により、この件について説明を求める必要がありました。

Visual Studio のソリューションで、他のいくつかのプロジェクトから参照されているクラス ライブラリがあります。プロジェクトの 1 つは、特定の外部ユーザーに展開される Windows アプリケーションです。アプリケーションが正しいアセンブリを使用していることを確認し、他のユーザーがアセンブリを使用できないようにするために (有効性に関する制限があることは承知しています)、すべてのアセンブリが署名され、ライブラリ内のすべてのクラスが宣言されています。フレンド (内部) として。

Web サイト プロジェクトにはアセンブリに署名する方法がないようで、ライブラリから何かを使用しようとすると、次のメッセージが表示されます。期待される。

次の属性は、クラス ライブラリ プロジェクトの AssemblyInfo.vb ファイル内にあります。

<Assembly: InternalsVisibleTo("OtherProject1, PublicKey=AAA...")>
<Assembly: InternalsVisibleTo("OtherProject2, PublicKey=AAA...")>
...

私の結論:

これを行う最もクリーンな方法は、Web サイトを Web アプリケーションに変換することのように見えますが、私たちのサイトはすでにかなり肉付けされており、他の議論で指摘されているように、これを行うには少し時間がかかります。行う。今後は、最初に Web アプリケーションを作成する方がより良いアイデアであり、将来の開発に対してはるかに柔軟だったと思います。

4

3 に答える 3

1

2つのプロジェクトが同じキーで署名されている必要はありません。すべてのフレームワークアセンブリがすべてMSのキーで署名されているため、アクセスできませんが、WebサイトプロジェクトとWebアプリケーションプロジェクトの両方からそれらを喜んで参照できます。

Webサイトプロジェクトから署名されたアセンブリを参照することを妨げるものは何もありません-どのようなエラーが表示されていますか?


編集して追加

更新された情報に照らして、はい、次のいずれかを行う必要があると思います。

  1. WebサイトをWebアプリケーションに変換します。ご指摘のとおり、サイトに署名する方法はありません。実際、ASP.NETがサイト用に生成するライブラリを実際に制御することはできません。
  2. クラスライブラリの2つのバージョンをコンパイルします。1つは署名されており、もう1つは署名されていません。これを実現するには、おそらく条件付きコンパイルを使用できます。

編集して追加

条件付きコンパイルはおそらくすぐに乱雑になると思いますが、簡単に言うと次のように機能します。

  • クラスライブラリのプロジェクトプロパティを開き、[ビルド]タブに移動します。
  • [構成]ドロップダウンを[すべての構成]に切り替えます
  • [条件付きコンパイルシンボル]ボックスに、[内部]などの新しいシンボルを追加します。

公開するクラスライブラリに移動し、次のように変更します。

#if INTERNAL
  internal class MyClass
#else
  public class MyClass
#endif
  {
    [...]
  }

次に、ライブラリのパブリックバージョンを作成する必要がある場合は、プロパティから「INTERNAL」シンボルを削除して再構築します。このシンボルが定義された新しいデバッグ構成とリリース構成のセットを作成し、切り替えることで、これを簡単に行うことができます。 [ソリューション構成]ドロップダウンを使用してそれらを使用します。

潜在的な問題:

  1. シンボルが定義されているかどうかを判断するのは簡単ではないかもしれません-バニラVSの動作はわかりませんが、ReSharperをインストールすると、コンパイルされないコードの部分がグレー表示されます現在の記号のセットの下で、入力時にアクセスできないものとしてクラスにフラグを立てます。
  2. プロパティとメソッドをpublicそのままにして、「内部」としてビルドしない場合にアクセスできるようにしますが、これは少し奇妙に見えます(ただし、警告は生成されないため、明らかに合法です)。 。
于 2011-03-30T16:13:44.097 に答える
1

問題をより明確に把握できたので、元の回答がうまく当てはまらないことがわかりました。私が以前に同様の状況で行ったことは、ソース管理を使用して "Friend" クラスのコード ファイルを使用するプロジェクトに分岐し、それらが使用するアセンブリの一部としてコンパイルされるようにすることでした。

私の場合、コードを別の dll に入れずに別のサーバー コントロール プロジェクトで再利用しようとしましたが、Web サイトのシナリオでもうまくいくと思います。クラスはサイトの一部としてコンパイルされるため、Web サイトで署名付き DLL を参照する必要がなく、すべての内部宣言を利用できるはずです。

これが選択肢になるかどうかはわかりませんが、使用するソース管理ツール、コード リポジトリの設定方法、分岐とマージの概念にどれだけ慣れているかによって大きく異なります。

于 2011-03-31T12:15:36.067 に答える
0

署名されたアセンブリのパブリック メンバーは、DLL にアクセスできる他のすべてのプロジェクトで使用できる必要があります。私はいくつかの署名済みアセンブリを作成し、それらをチームの他のメンバーに配布しました。それらを Web サイト、Web プロジェクト、およびコンソール アプリの組み合わせで使用しました。競合が発生したのは、コンソール アプリで HttpContext.Current を参照するアセンブリを使用しようとしたときだけでした。この参照を利用した方法を避ければ、それでもうまくいきました。

署名/キーが問題になる唯一のケースは、それらを「友達」にしようとしている場合です。つまり、お互いの内部型とメソッドを見ることができます。フレンドと署名に関するルールは、http: //msdn.microsoft.com/en-us/library/0tke9fxk.aspxに記載されています。

于 2011-03-30T16:36:50.150 に答える