0

我在这方面的第一次尝试失败了,但我希望这是可能的。如果我有一个这样的类是 COM 注册的:

[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";
    }
}

我的第一次尝试返回了错误:IUnknown:SomeMethod(没有导出方法),但我希望这样做可能有一些我不知道的技巧。

4

1 回答 1

0

我发现如果您将类标记为 ComVisible,这是可能的(仅将接口标记为 ComVisible 是不够的)。我现在可以通过 COM 使用 ClassLibrary3。见下面的代码:

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();
    }
}
}

完全独立的库,不是“Regasm”ed:

namespace ClassLibrary3
{

[ComVisible(true)]
public class Class1 
{
    public string SomeMethod()
    {
        MessageBox.Show("ClassLibrary3.Class1.SomeMethod....");
        return "ClassLibrary3.Class1.SomeMethod";
    }
}
}
于 2017-03-08T22:51:18.350 回答