3

私は、Visual Studio 2008でWebプロジェクトには、次の2種類の異なる承知している:Webサイトプロジェクトでビジュアルスタジオで署名付きアセンブリを参照することは可能ですか?

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

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

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

編集:

次のような状況では、この問題に明確化を求めるために私を必要としています

私はVisual Studioでの私の溶液中でいくつかの他のプロジェクトによって参照されているクラスライブラリを持っています。プロジェクトの1つは、特定の外部ユーザーに展開されるWindowsアプリケーションです。アプリケーションが正しいアセンブリを使用していることを確認し、他の人がアセンブリを使用できないようにするために(私はその有効性に関する制限を認識しています)、すべてのアセンブリが署名され、ライブラリのすべてのクラスが宣言されます友人(内部)として。

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

次の属性

は、私のクラスライブラリプロジェクトのAssemblyInfo.vbファイル内にある:

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

私の結論:

は、ウェブサイトを変換することですこれを行うにはクリーンな方法のように見えるウェブアプリケーションに組み込むことができますが、これはサイトがかなり洗練されていて、他の議論で指摘されているように、行うにはかなり時間がかかります。今後は、Webアプリケーションを作成することがより良いアイデアであり、将来の開発のためにはるかに柔軟性があるかもしれないと思います。

+0

私が参考に署名したアセンブリを追加しました。 (クラスライブラリである)アセンブリには何もで取得しようとしたら、私は、次のメッセージが表示されます:「それは 『友達』であるため、クラスは、この文脈で課税ではありません」。このウェブサイトの議会が署名されていないので、私は何を期待していますか?私がそれらを両方とも働かせるために、またはこれがウェブサイトプロジェクトの単なる限界であるかどうか私ができる何かがあるかどうか疑問に思う。 – Michael

+0

うん、私はあなたのウェブサイト(それをデバッグするプリコンパイルサイトに基本的に必要はありません)から取得限られた利益は急速に痛みのこれらの種類を上回るされていることがわかります。 –

答えて

1

2つのプロジェクトが同じ鍵で署名される必要はありません。すべてのフレームワークアセンブリがすべてMSの鍵で署名された後で、まだアクセスできないWebサイトとWebアプリケーションプロジェクト。

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


編集は、あなたの更新された情報に照らして

を追加するために、はい、私はどちらかにあなたが持っていると思う:

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

編集私は、条件付きコンパイルは、おそらくすぐに乱雑になってしまいますが、簡単に、それはこのように働くだろうと思います

を追加する:

  • プロジェクトを開くプロパティクラスライブラリの[ビルド]タブに移動します。
  • 「すべての構成」に切り替えます。
  • 「条件付き編集記号」ボックスに、「内部」などの新しい記号を追加します。あなたが公開して、のようなものにそれらを変更したいクラスライブラリへ

移動:あなたがライブラリの公開バージョンを生成する必要がある場合に

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

次に、「INTERNALを削除します"記号をプロパティから削除して再構築することができます。このシンボルが定義された新しいデバッグおよびリリース構成を作成し、[ソリューション構成]ドロップダウンメニューを使用して切り替えます。

潜在的な問題: - 私は行動がバニラVSにあるかわからない、ReSharperのは、それが意志インストールがで

  1. は、あなたが、シンボル定義されたかどうかを持っているかどうかを言うことは容易ではないかもしれません現在のシンボルセットでコンパイルされないコードの部分をグレーアウトし、入力時にアクセス不可能なクラスとしてフラグを立てます。
  2. プロパティとメソッドはpublicのままにしておきたいので、「内部」としてビルドしないとアクセスできますが、少し奇妙に見えます(ただし、明らかに合法です)。
+0

元の質問の私の現在の状況に関するいくつかの追加情報を追加しました。 – Michael

+0

ご提案をもとに、Webアプリケーションに変換することが理想的な選択のように思えるが、我々は、我々はウェブサイトのプロジェクトで作業を取得するいくつかの利点を失うことになります。しかし、それが最も簡単な解決策ならば、それはちょうどそれに来なければならないかもしれません。条件付きコンパイルに関する情報はありますか?図書館の関連クラスのほとんどは社内で宣言されていますが、それらをすべて公開する必要がありますか?また、私は、署名されたアセンブリを作成し、その後、パブリックとしてすべての内部で署名のないアセンブリを作成する必要があるようだ。 – Michael

+0

余分な情報をありがとう。私は条件付きコンパイルが可能であることに気づいていませんでしたが、知っておくと良いです。 – Michael

0

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

署名/キーが問題となる唯一のケースは、「友だち」にしようとしている場合です。つまり、それぞれが内部のタイプとメソッドを互いに見ることができます。友人と署名についての規則はここに文書化されています:http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx

1

私は問題のより明確なイメージを持っているので、元の答えはうまく適用されません。私は似たような状況で前にやったことは、彼らが消費するアセンブリの一部としてコンパイルするように消費するプロジェクトに「フレンド」のクラスのコードファイルを分岐するソースコントロールを使用することでした。私の場合は

私は別のDLLにそれを置くことなく、異なるサーバーコントロールのプロジェクトにいくつかのコードを再利用しようとしていたが、私はそれはまた、あなたのウェブサイトのシナリオのために働くだろうと思います。クラスがサイトの一部としてコンパイルされているため、内部宣言のすべてを利用できるようになっているため、Webサイトで署名されたDLLを参照する必要はありません。

これはあなたのためのオプションであるかどうかわかりませんが、主に使用するソースコントロールツール、コードリポジトリの設定方法、分岐とマージのコンセプトの快適さによって異なります。

+0

チップをありがとう。それは確かに難しいだろうが、将来チェックアウトする価値があるかもしれない。 – Michael

関連する問題