2

Microsoft Excel で .NET クラス ライブラリにアクセスしようとしています。これを行うには、.NET クラス ライブラリを COM に登録する必要があることを知っています。そこで、アセンブリ情報に移動して、COM Visible を true に設定しようとしました。次に、ビルドタブで、Register for COM Interop も true に設定しました。AssemblyInfo.cs ファイルを確認したところ、次のものが含まれています[assembly: ComVisible(true)]. しかし、何らかの理由で、Excel で Class Lib への参照を追加しようとすると、名前空間がリストに表示されません。何も入っていない簡単なテスト クラス ライブラリを作成し、同じこと (COM Vis = true を設定し、COM Interop に登録 = true を設定) を行ったところ、利用可能な参照のリストに表示されます。2つのクラスの違いがわかりません。クラスが実際に COM 相互運用に登録されているかどうかはわかりません。これを修正するために私に何ができるか知っている人はいますか???

追加: RegAsm を使用してクラスを手動で登録しようとしましたが、次のメッセージが表示されます..."RegAsm : warning RA0000 : No types were registered"

追加: プロジェクトの出力ディレクトリを確認したところ、プロジェクトのビルド時にタイプ ライブラリ ファイル (*.tlb) が作成されていないことに気付きました。各クラスに独自の GUID 属性があることを確認しました。プロジェクトには、構造体、インターフェイス、または列挙型が含まれていません。

4

2 に答える 2

4

問題が見つかりました。実際には 2 つの問題が原因でした。Visual Studio でプロジェクトをビルドすると、タイプ ライブラリ ファイルが作成されていないことに気付きました。登録できるクラスが見つからなかったため、登録が行われていないという警告を発見しました。もう少し深く掘り下げると、これらの2つのルールが見つかりました。1. 静的クラスは COM に登録されません。2. すべてのクラスには、COM を介してインスタンス化されるパブリックの既定のコンストラクターが必要です。

MSDN から: COM を介してインスタンス化するには、型にパブリックの既定のコンストラクターが必要です。マネージド型とパブリック型は、COM から参照できます。ただし、パブリックの既定のコンストラクター (引数のないコンストラクター) がないと、COM クライアントは型のインスタンスを作成できません。型が別の方法でインスタンス化され、インスタンスが COM クライアントに返される場合、COM クライアントはその型を引き続き使用できます。これらの型のさまざまな引数を受け入れる、オーバーロードされたコンストラクターを含めることができます。ただし、引数を受け入れるコンストラクターは、マネージ (.NET) コードからのみ呼び出すことができます。

于 2010-04-01T12:14:04.250 に答える
0

Excel でアドインのセキュリティを確認します。また、必ずすべてをファイルに記録してください。MS Office は、アドインの実行中に発生した例外を処理する傾向があります。

于 2010-03-31T19:19:46.380 に答える