我必须在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吗?
答案 0 :(得分:1)
如果您使用.net 4
,则可以使用dynamicsSystem.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。