2011-12-23 31 views
2

我必須在C#中實現COM動作。 COM對象是Evidian的SSOEngine。如何在以前的InvokeMember結果上調用成員?

我有VB.NET示例。我必須翻譯成C#。

在VB.NET,我可以做的代碼工作:

Dim oSSO, oApp 
oSSO = CreateObject("SSOEngine.SSOEngine") 
oApp = oSSO.GetApplication2("myApp", "MyPassword", 0) 
return oApp.LoginId(0) 

在C#中,我做了下面的代碼

System.Type objTypeSSOEngine = Type.GetTypeFromProgID("SSOEngine.SSOEngine"); 
object instSSOEngine = Activator.CreateInstance(objTypeSSOEngine); 
object o = objTypeSSOEngine.InvokeMember("GetApplication2", 
      System.Reflection.BindingFlags.InvokeMethod, null, 
      instSSOEngine, new object[] { "myApp", "MyPassword", 0 }); 

我擋在了oApp.LoginId(0 )line ... 你知道如何對o對象做另一個InvokeMember嗎?

+0

你使用.net 4嗎? – 2011-12-23 16:08:33

+0

嗨,不,我使用.NET 2.0 – Sylvain 2011-12-23 22:22:22

回答

1

你可以的,如果你使用的是.NET 4

System.Type objTypeSSOEngine = Type.GetTypeFromProgID("SSOEngine.SSOEngine"); 
dynamic instSSOEngine = Activator.CreateInstance(objTypeSSOEngine); 
dynamic oApp = objTypeSSOEngine.GetApplication2("myApp", "MyPassword", 0); 
return oApp.LoginId(0); 

在如果沒有,你可以添加COM參考案例的情況下,使用dynamics(添加引用 - > COM在Visual Studio中)和Visual Studio將生成合適的類和接口管理中間的DLL

你希望這有助於

1

.NET 2.0 - > 3.5

如果您知道從GetApplication2調用返回的對象type,只需將其轉換爲已知類型並調用所需的函數。

object o = objTypeSSOEngine.InvokeMember("GetApplication2", 
      System.Reflection.BindingFlags.InvokeMethod, null, 
      instSSOEngine, new object[] { "myApp", "MyPassword", 0 }); 

KnownType tp = o as KnownType; 
if(tp!=null) 
    tp .LoginId(0) 

.NET 4.0

使用dynamic

一個僞

System.Type objTypeSSOEngine = Type.GetTypeFromProgID("SSOEngine.SSOEngine"); 
dynamic instSSOEngine = Activator.CreateInstance(objTypeSSOEngine); 
dynamic oApp = instSSOEngine.GetApplication2("myApp", "MyPassword", 0) 
return oApp.LoginId(0) 

事情是這樣的......

何這有助於。

+0

你好,非常感謝!我不在.NET 4.0,所以我不能使用動態...(我不知道那'變種'類型...太棒了!)... 也我不能使用.NET 4.0 ... 我知道返回對象的類型是SSOApplication,但我需要創建一個對C++ dll的引用來引用它,我認爲... – Sylvain 2011-12-23 22:31:27

1

我建議使用動態類型。 (MSDN)

您可以將ANY對象轉換爲此類型,並且不需要使用反射。

相關問題