2017-03-08 15 views
0

私のこの最初の試みは失敗しましたが、私はそれが可能であることを望んでいます。.net COMVisible/ComInterop - 登録せずにタイプを使用できますか?

[ComVisible(true)] 
public interface Resolver 
{ 
    object Resolve(string type); 
} 

[ProgId("ClassResolver")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("53DB4409-0827-471D-94CE-2601D691D04C")] 
public class Class1:Resolver 
{ 
    public object Resolve(string type) 
    { 
     return (ClassLibrary2.Interface1) new ClassLibrary2.Class1(); 
    } 
} 

は、私は(それが別のライブラリにあります)のComVisibleが、登録されていないClass2.Interface1を返すためにそれを使用することができます::

[ComVisible(true)] 
public interface Interface1 
{ 
    string SomeMethod(); 
} 


public class Class1:Interface1 
{ 
    public string SomeMethod() 
    { 
     MessageBox.Show("SomeMethod"); 
     return "SomeMethod"; 
    } 
} 

私の私は、COMが登録されている。このようなクラスを持っている場合最初の試行でエラーが返されました:IUnknown:SomeMethod(エクスポートされていないメソッド)ですが、これを行うにはわからないことがあるかもしれません。

+0

、何かがクライアントコードに問題があります。メソッドから* object *を返すには、クライアントが、予想されるインターフェイスタイプのバリアントでIDispatchまたはQueryInterfaceコールを介して「レイトバインディング」を使用する必要があります。 IUnknownになることはありません。おそらく、2つの異なるタイプのライブラリを持つことによって引き起こされる、キャスト時の賢明な試みではないでしょうか。ちょうど推測では、明らかに質問に明示的に文書化する必要があります。 –

答えて

0

クラスをComVisible(ComVisibleだけでは十分ではないインターフェイス)としてマークすると、これは可能です。 COM経由でClassLibrary3を使用できるようになりました。 「ます。regasm」編ではなかった

namespace ClassLibrary1 
{ 
[ComVisible(true)] 
public interface Resolver 
{ 
    object Resolve(string type); 
} 

[ProgId("ClassResolver2")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("83720331-12CB-48E1-947C-2413F7B9AB89")] 
public class Class1:Resolver 
{ 
    public object Resolve(string type) 
    { 
     return new ClassLibrary3.Class1(); 
    } 
} 
} 

全く別のライブラリ:コードの下に表示されるエラーメッセージが良い見ていない

namespace ClassLibrary3 
{ 

[ComVisible(true)] 
public class Class1 
{ 
    public string SomeMethod() 
    { 
     MessageBox.Show("ClassLibrary3.Class1.SomeMethod...."); 
     return "ClassLibrary3.Class1.SomeMethod"; 
    } 
} 
} 
関連する問題