簡體   English   中英

將C#動態與COM對象一起使用會引發RuntimeBinderException,以記錄已實現接口的方法

[英]Using C# dynamic with COM object throws RuntimeBinderException for documented method of implemented interface

我的應用程序需要與一個COM對象進行交互,由於與本文無關的原因,該對象無法添加到我的項目中作為參考。 我以為C#動態關鍵字將是完美的解決方案,但是在嘗試訪問我認為是准確的文檔化成員時遇到RuntimeBinderException。

為了完整起見,我將針對適用於ALM 12.20的HP應用程序生命周期管理(ALM)OTA COM庫進行工作,盡管我將歸納出我認為可能發生的情況,而不直接引用這些對象。

考慮以下COM對象的代碼結構(出於可讀性,使用C#語法)

public interface InterfaceA
{
    string PropertyA { get; }
}

public interface InterfaceB
{
    string PropertyB { get; }
}

public class ClassA : InterfaceA
{
    public string PropertyA { get; }
}

public class ClassB : ClassA, InterfaceB
{
    public string PropertyB { get; }
}

這是對象上方法的基本簽名,該簽名返回我需要使用的對象:

public InterfaceA ReturnObject()
{
    // Returns object that implements InterfaceA and also InterfaceB
    var myClassB = new ClassB();
    return myClassB;
}

下面顯示了如何使用這些對象的基礎知識(忽略特定的語法)

dynamic dynamicClassB = someOtherDynamicObject.ReturnObject();
Debug.WriteLine(dynamicClassB.PropertyA + "; this works");
Debug.WriteLine(dynamicClassB.PropertyB + "; this throws RuntimeBinderException");

我沒有編寫此COM庫,因此我不確定對象和接口的關系,但我相信偽代碼可以准確地反映正在發生的事情。

通常,您必須將ClassA顯式轉換為ClassB才能訪問ClassB對象的屬性,但是我對C#動態關鍵字的理解是,這不是必須的,甚至可能是不可能的。 在運行時,動態對象有可能被解析為ClassA的實例而不是ClassB的實例,這可能是由於返回對象的方法的簽名(因為它已將ClassA定義為返回類型)。

我已經為該庫中的許多COM對象成功地使用了dynamic,但是在類的實例(例如本例中的ClassB)上,特別麻煩一些方法/屬性。

想法/想法/解決方法表示贊賞。 我唯一不能做的就是直接在項目中引用COM DLL。 提前致謝。

對於我的場景,事實證明我的文檔不准確,並且RuntimeBinderException有效,因為所請求的成員沒有出現在COM對象上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM