在VB(ASP.NET)中
Application("myapp")= Server.CreateObject("APP.Engine")
aa = Application("myapp").myMethod(2)
作品。
在C#中我试过
Application["myapp"]= Server.CreateObject("APP.Engine")
但是
Application["myapp"].myMethod(2)
失败
'object' does not contain a definition for 'myMethod'
如何在C#中公开公共接口?
答案 0 :(得分:7)
如果您可以访问定义类型(即不是原始COM对象),则只需转换:
((APP.Engine)Application["myapp"]).myMethod(2);
如果您使用的是c#4.0,则可以执行以下操作:
dymamic myApp = Application["myapp"];
myApp.myMethod(2);
否则,您必须使用反射和Type.InvokeMember(...)
答案 1 :(得分:3)
您需要先投射到正确的班级,例如:
((APP.Engine)Application["myapp"]).myMethod(2)
答案 2 :(得分:0)
将Application [“myapp”]的结果转换为正确的类型,如下所示:
((APP.Engine)Application["myapp"]).myMethod(2);
其他选项包括创建本地引用并使用它。
答案 3 :(得分:0)
这基本上是因为C#是强类型语言。当您调用Application时,您实际上正在调用Object类型的集合。该集合实际上是一个Object数组。我们将它作为对象,因为它可以让您将几乎任何东西存储到集合中。
现在Application [“myapp”]最终将返回System.Object类型的对象。
因此您需要将对象类型转换为您的类型。
App.Engine obj = Application["myapp"] as App.Engine;
if(obj != null)
obj.myMethod(2);
对象obj是对实际类型的引用,如果调用myMethod(2),编译器不会抛出任何异常。
答案 4 :(得分:0)
在将代码从VB
转换为C#
时记住一件事是,C#是强类型语言,在您访问任何类型之前,您需要转换它。但是在VB中不需要相同的。
因此,对于此示例,您需要使用App.Engine
进行类型转换。
((APP.Engine)Application["myapp"]).myMethod(2)