8

我希望将一些 VB6/COM+ 代码转换为 C#/COM+

但是在 VB6 或 VB.NET 中我有:

Dim objAdmin
objAdmin = Server.CreateObject("AppAdmin.GUI")
objAdmin.ShowPortal()

在 C# 中,我似乎必须执行以下操作:

object objAdmin = null;
System.Type objAdminType = System.Type.GetTypeFromProgID("AppAdmin.GUI");
m_objAdmin = System.Activator.CreateInstance(objAdminType);
objAdminType.InvokeMember("ShowPortal", System.Reflection.BindingFlags.InvokeMethod, null, objAdmin, null);

有没有办法让 c# 不必使用 InvokeMember 函数而直接调用该函数?

4

3 回答 3

11

有没有办法让 c# 不必使用 InvokeMember 函数而直接调用该函数?

是的,从具有动态类型的 C# 4 开始:

dynamic admin = Activator.CreateInstance(Type.GetTypeFromProgID("AppAdmin.GUI"));
admin.ShowPortal();

它在这部分中仍然更加冗长CreateObject,但是如果您愿意,您可以随时将其包装在方法调用中。(可能有一个我不知道的现有调用,或者您可以尝试查找在这种情况下 VB 调用的任何内容 - 我不知道 的详细信息Server.CreateObject。)

请注意,动态类型比让反射更简单更丰富但它确实做到了。在幕后,虽然这两种情况都会发生同样的事情——它仍然不会像静态绑定那样快,但几乎可以肯定它已经足够快了。

于 2012-09-07T13:49:29.723 回答
6

是的,您可以使用dynamic关键字

dynamic objAdmin = System.Activator.CreateInstance(objAdminType);
objAdmin.ShowPortal();
于 2012-09-07T13:49:18.937 回答
-1

如果您有权访问实际的类类型,则可以按如下方式进行:

AppAdminClass m_objAdmin = (AppAdminClass)System.Activator.CreateInstance(typeof(AppAdminClass));
m_objAdmin.ShowPortal();
于 2012-09-07T13:55:31.790 回答