Предоставление типов из встроенного типа взаимодействия другим сборкам

У меня есть библиотека ATL COM, которая определяет enum и интерфейс в 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 является ссылочным типом (требует, чтобы я включил PIA, сгенерированный из typelib):

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, и я хотел бы предоставить это перечисление и интерфейс, чтобы его могли использовать внешние стороны без необходимости доставки PIA, сгенерированной из библиотеки типов библиотеки ATL COM. Является ли это возможным?

1 ответ

Решение

По-видимому, это не может быть сделано. Одна из ошибок (CS1748) указала мне на этот пост, в котором говорится, что PIA должна быть связана обеими сборками.

Другие вопросы по тегам