如何在以前的InvokeMember结果上调用成员?

时间:2011-12-23 16:00:24

标签: c#

我必须在C#中实现COM动作。 COM对象是Evidian的SSOEngine。

我有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)行被阻止了... 你知道怎么在o对象上做另一个InvokeMember吗?

3 个答案:

答案 0 :(得分:1)

如果您使用.net 4

,则可以使用dynamics
System.Type objTypeSSOEngine = Type.GetTypeFromProgID("SSOEngine.SSOEngine");
dynamic instSSOEngine = Activator.CreateInstance(objTypeSSOEngine);
dynamic oApp = objTypeSSOEngine.GetApplication2("myApp", "MyPassword", 0 );
return oApp.LoginId(0);

如果没有,你可以添加COM引用(在visual studio中添加引用 - > COM),Visual Studio将为你生成带有合适的类和接口的托管中级dll

希望这有帮助

答案 1 :(得分:1)

.NET 2.0 - > 3.5

如果您知道type调用对象的GetApplication2,只需将其转换为已知类型并调用您需要的函数。

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)

像这样......

希望这有帮助。

答案 2 :(得分:1)

我建议使用动态类型。 (MSDN)

您可以将任何对象强制转换为此类型,而不需要使用Reflection。