2017-03-27 7 views
0

私はVBAで使用するクラスライブラリを作成するのに苦労しています。私はプロジェクトに1つのクラスを持っていますが、2番目のクラスは登録されていないようです。 VBSを使ってテストすると、CreateObject( "Libname.Class2")は動作しますが、CreateObject( "Libname.Class1")は "ActiveXコンポーネントはオブジェクトを作成できません"というエラーを出します。 RegAsmは有用なフィードバックを提供していません - それはただいくつかのタイプが輸出されたと言いますが、他のタイプがなぜそうではなかったかを教えてくれません。私はまた、Class2をOleViewで見つけることができます。アセンブリ内のいくつかのクラスがCOMに公開されるのはなぜですか?

この種のエラーに関する質問に対するほとんどの回答は、RegAsmのバージョン(x86/x64)が間違っていたが、1つのクラスが正常に登録されていると仮定すると、私はどちらのバージョンにも登録しています。デフォルトのコンストラクタに含まれているものがあることを確認して、最適化されないようにすることを示唆した回答もありましたが、どちらも役に立たないようです。

二つがまったく同じ属性(離れのProgIdから)を有し、比較的類似のインターフェースを持っている:

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface _Class1 
{ 
    _Class2 GetClass2(); 

    string testertong { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Libname.Class1")] 
[ComVisible(true)] 
class Class1 : _Class1 
{ 
    private ...; 

    public Class1() 
    { 
     /* Constructor stuff - commenting it out doesn't help */ 
    } 

    public _Class2 GetClass2() 
    { 
     /* Generate and return an instance of Class2. Tried return null too */ 
    } 

    public string testertong 
    { 
     get 
     { 
      return "I love yams"; 
     } 
    } 
} 

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface _Class2 
{ 
    ArrayList GetLog(int entries); 

    string testytest { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Libname.Class2")] 
[ComVisible(true)] 
public class Class2 : _Class2 
{ 
    internal IThing client; 

    public Class2() 
    { 
     /* Currently empty but works fine */ 
    } 

    public ArrayList GetSubmissionLog(int entries) 
    { 
     return new ArrayList(client.GetSubmissionLog(entries)); 
    } 

    public string testytest 
    { 
     get { return "wololo"; } 
    } 
} 

クラス2は、実際に、私が作成した2つの第一だったとコンパイルされた。 Class1は、実際にはWCFセットアップを行うためのFactoryオブジェクトになります。以前に登録されたアセンブリにクラスを追加すると問題が発生するかどうかはわかりません(どうすれば修正できますか)。

次VBSは期待通りに動作します:

Set y = CreateObject("Libname.Class2") 
Msgbox y.testytest 

どのような援助がずっとあなたが可視性レベルを指定していないので、

答えて

0

Class1が暗黙的internalにある認識されます。

[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Libname.Class1")] 
[ComVisible(true)] 
public class Class1 : _Class1 
{ 

に変更し、それはこれがComVisibleAttributeの下で文書化されています

のみ公共の種類が見えるようにすることができます。この属性を使用して、内部または保護された型をCOMに表示したり、非表示型のメンバを表示したりすることはできません。

+0

さて、それは私が見逃していたのはかなりばかげていました。ありがとうございました! – user2782092

関連する問題