私は現在、Inventor (3d モデリング ソフトウェア) のアドインに取り組んでいます。APIを使用している場合、2つの異なる種類のドキュメントがあります
- アセンブリ ドキュメント
- パーツドキュメント
API は、選択したドキュメントを返すメソッドを提供します。
PartDocument part = ((PartDocument)application.ActiveDocument);
実行時にこのキャストが機能します。コンパイラは、「PartDocument」が「application.ActiveDocument」が返す型を実装していないため、疑わしいキャストであると通知します。
[TypeLibType(TypeLibTypeFlags.FDispatchable)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("xxxxxx")]
[DefaultMember("Type")]
[ComImport]
public interface PartDocument
{
....
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[TypeLibType(TypeLibTypeFlags.FDispatchable)]
[Guid("xxxxx")]
[DefaultMember("Type")]
[ComImport]
public interface Application
{...
[DispId(50331905)]
_Document ActiveDocument { [DispId(50331905), MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] [return: MarshalAs(UnmanagedType.Interface)] get; }
[Guid("xxxxxx")]
[CoClass(typeof (_DocumentClass))]
[ComImport]
public interface _Document : Document, _VbaImplementationEvents_Event
{
}
では、なぜこれが機能しているのでしょうか。誰かがこれを私に説明できますか?
そして、どうすればこれをテストできますか?
var documentMock =new Mock<PartDocument>();
var applicationMock = new Mock<Application>();
applicationMock.Setup(x => x.ActiveDocument).Returns(documentMock.Object);
コンパイラは、'PartDocument' から '_Document' にキャストできないと言っています --> これは正しいのに、なぜ実行時に機能するのですか?
前もって感謝します