我必须在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吗?
发布于 2011-12-24 00:12:18
如果您使用的是.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中的add reference -> COM ),Visual Studio将为您生成具有适当类和接口的托管中间动态链接库
希望这能有所帮助
发布于 2011-12-24 00:14:14
.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)就像这样..。
希望这能有所帮助。
发布于 2011-12-24 00:14:17
我推荐使用动态类型。(MSDN)
您可以将任何对象强制转换为此类型,并且不需要使用反射。
https://stackoverflow.com/questions/8618053
复制相似问题