2009-11-06 17 views
6

私にはCOMに公開されている.NETアセンブリがあります。アセンブリには、2つのパブリックインターフェイスと1つのパブリッククラスがあります。アセンブリを作成すると、この警告が表示されます。COM相互運用機能の登録

(assemblyName.dll)には、COM相互運用機能に登録できるタイプが含まれていません。

私のアセンブリ情報には、次の行が含まれています。ウェブ上でこの問題を持つ

[assembly: ComVisible(true)] 

ほとんどの人は、私が発見したことを、自分のアセンブリ情報で上記の行でそれを修正しました。これは私にとっては役に立たなかった。

また、クラスとインターフェイスの定義に[ComVisible(true)]を追加しようとしましたが、それも役に立たなかった。ここで

答えて

15

のComVisibleクラスは、一般公衆デフォルトコンストラクタが必要です。メンバーは、通常、ComVisibleタイプのみを参照する必要があります。

アセンブリレベルで指定した場合は、クラスにComVisible(true)を指定する必要はありません。

しかし、のComVisibleクラスでアセンブリを生成するための通常の方法は次のとおりです。

  • は、アセンブリレベルでのComVisible(false)を指定します。したがって、明示的にComVisible(true)でマークされたクラスだけがCOMに公開されます。

  • 明示のComVisibleインタフェース定義:

例を

[ 
ComVisible(true), 
GuidAttribute("..."), 
Description("...") 
] 
public interface IMyComVisibleType 
{ 
     // members... 
    } 
  • あなたのComVisibleクラスはClassInterfaceType.Noneを指定する必要があります、とのComVisibleインタフェースを実装する必要があります。

例えば

 [ 
    ComVisible(true), 
    GuidAttribute("..."), 
    ClassInterface(ClassInterfaceType.None) 
    ] 
    public sealed class MyComVisibleType : IMyComVisibleType 
    { 
     // implementation ... 
    } 

GuidおよびDescription属性は必須ではありませんが、COM生成の詳細を制御するのに便利です。

上記が役に立たない場合は、サンプルコードを投稿してみてください。誰かが助けてくれると確信しています。

+1

デフォルトのコンストラクタを追加することを忘れてしまったときに、私は時々こう言います。 –

+1

パブリックのデフォルトのコンストラクタを追加することはトリックでしたが、問題のクラスは.netコードからのみ構築されます。これは公的なデフォルトコンストラクタが提供されなかった理由です。この警告は、インターフェイスのみを含むアセンブリにも表示されると考えています。 – trampster

+0

はい、インターフェイスだけのアセンブリでも同じ警告が表示されます。 VB6 ActiveX DLLには、少なくとも1つの公開可能なクラスが含まれている必要があります。しかし、管理されたコードによって構築され、COMコンポーネントに渡されるクラスを持つことができるように、.NETの世界では不必要に制限されているようです。メソッドの引数として。 – Joe

0

は真

  • にいくつか他のものは、公共
  • はアセンブリ
  • の追加に加えて、直接型にComVisible(true)属性を追加して登録したいタイプがマークされていることを確認しますGuid属性

最後の2つが厳密に必要な場合はわかりませんが、私はそれらを試してみます。

+0

GUIDは、完全修飾クラス名のhasとクラスを含むアセンブリのIDに基づいて、ビルド時に生成されます。つまり、これを自分で行う必要はありません。 – trampster

+0

タイプにComVisable(true)を試して+タイプがパブリックであることをダブルチェックしました。まだ運がありません。 – trampster

+0

公開された各クラスにGUID属性を追加するとどうなりますか? – Beached

0

強い名前のアセンブリが必要だと思います。キーファイルを使用してアセンブリに署名しますか?

また、また指定してみてください: [のGUID( "{新たに生成されたGUID}")] [ClassInterface(ClassInterfaceType.AutoDual)]

+0

いいえ私は強くする必要はありません。私は他の.netアセンブリをcom interopのために働き、stongという名前ではありません。 – trampster

+0

デフォルトのパラメータのないパブリックコンストラクタも必要であることを忘れています。 – logicnp

2

デフォルトコンストラクタの問題が発生しました。私が騙されたのは、クラスが登録されていなくても型ライブラリファイルにクラスGUID参照が含まれるということでした。

regasm assembly.dll /regfile:assembly.reg /codebase 

COM Interop: Base class properties not exposed to COMにインターフェースをさらすのは良い議論があります:登録されますかを確認する簡単な方法は、次のようにレジストリファイル(「assembly.reg」)を作成することです。いくつかのコード例は、Exposing .NET Components to COMです。

0

C#プロジェクトの[Register for COM interop]オプションをチェックしたプロジェクトで同じ問題が発生しました。

ソリューションエクスプローラで、[プロパティ]フォルダに移動します。 AssemblyInfo.csファイルを開きます。行までスクロール: [assembly: ComVisible(false)]

変更をこれに: [assembly: ComVisible(true)]

これは、その後、COMの可視性のための.NETコードを可能にする、警告メッセージを削除し、作成する.tlbファイルを可能にします。
アセンブリ全体をCOMで表示したくない場合は、上記の他のヒントのいずれかを実行します。

関連する問題