将类型从嵌入式互操作类型公开到其他组件

时间:2014-09-03 13:11:49

标签: c#-4.0 interop com-interop pia type-equivalence

我有一个ATL COM库,它在MIDL中定义枚举和接口,如:

[uuid(65785D49-574A-4B1B-95F1-B9C7F283364A)]
typedef enum Options
{
    Option1,
    Option2
} Options;

[
    object,
    uuid(2E3D1B1A-DF95-434F-836B-73FF1245B608),
    oleautomation,
    nonextensible,
    pointer_default(unique)
]
interface IExample : IUnknown
{
    HRESULT Test([in] Options option, [out, retval] BSTR* str);
};

然后我创建一个托管程序集并引用TLB,它创建一个PIA并将类型(Embed Interop Types = true)嵌入到托管程序集中。

在托管程序集中,我现在创建一个实现接口的类:

public class Example : IExample
{
    public string Test(Options option)
    {
        return option.ToString();
    }
}

现在我想创建一个引用托管程序集并创建对象并调用它的第三个程序集,但它不允许我,因为Options是一个未引用的类型(要求我包含从typelib生成的PIA ):

public class Equivalence
{
    public void UseTest()
    {
        Example e = new Example();
        e.Test(Options.Option1);    // recognizes that it requires an ExampleLib.Options parameter, but that type isn't available
    }
}

使用反射器,我可以在托管程序集中看到它,但是对象浏览器无法查看它:

namespace ExampleLib
{
    [ComImport, CompilerGenerated, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("2E3D1B1A-DF95-434F-836B-73FF1245B608"), TypeIdentifier]
    public interface IExample

    [Guid("65785D49-574A-4B1B-95F1-B9C7F283364A"), CompilerGenerated, TypeIdentifier("15a6cf97-c415-4866-bdfb-7da65edb1faa", "ExampleLib.Options")]
    public enum Options
}

我的托管程序集本身就是一个旨在作为API分发的库,我想公开这个枚举和接口,以便外部各方可以使用它,而不必提供从ATL的类型库生成的PIA COM库。有可能吗?

1 个答案:

答案 0 :(得分:1)

显然这不可能。其中一个错误(CS1748)向我指出this post表示PIA必须由两个程序集链接。