Предоставление типов из встроенного типа взаимодействия другим сборкам
У меня есть библиотека 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 должна быть связана обеими сборками.