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