[英]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.