2011-09-30 104 views
3

这不会很容易解释清楚,但在这里不用...实现接口然后调用初始化()函数

我有一些在VB中工作正常,但不是在C#。

我有2个类,每个类实现不同的接口。每个接口都暴露一个Initialize()函数,该函数在插件加载时应该自动调用。因为每个类都有一个Initialize()函数,所以我可以在日志中看到两个函数被调用。这在VB中正常工作。

当我在C#中做同样的事情时,只有第一个类中的Initialize()被调用。任何人都有线索,为什么这可能会发生?

VB代码:

Public Class class1 
    Implements Interface1 

    Public Sub Initialize() Implements Interface1.Initialize 
     msgbox("initialize from class1") 
    End Sub 
End Class 

Public Class class2 
    Implements Interface2 

    Public Sub Initialize() Implements Interface2.Initialize 
     msgbox("initialize from class2") 
    End Sub 
End Class 

C#代码:

public class class1 : interface1 
{ 
    public void Initialize() 
    { 
     messagebox.show("initialize from class1"); 
    } 
} 

public class class2 : interface2 
{ 
    public void Initialize() 
    { 
     messagebox.show("initialize from class2"); 
    } 
} 

正如你所看到的代码是在两种语言相同。为什么它在VB中而不是在C#中工作?

+0

你是怎么称呼它的? –

+7

你能分享调用初始化函数的代码吗? –

+0

不幸的是我没有访问调用代码。开发人员只是提供接口供我使用。如果你有某种想法,我可以将它传递给他们看。 –

回答

0

谢谢大家对你的帮助!原来问题出在调用代码中。长话短说,每个插件都有一个命令ID作为界面的一部分。在这种情况下,两者都有ID 1000.当调用代码循环通过插件加载时,如果它看到重复的ID,则跳过该插件。我的问题是我使用相同的ID同时加载了其他插件。你们都帮助找到了调用代码中的错误(这是非常知名的软件),所以谢谢你!

+0

**你们都帮忙找到了调用代码中的错误(这是非常知名的软件),所以谢谢你!**这不是一个错误。当然可以争辩说,加载扩展的软件应该为其分配一个识别号码。 –

+0

@Ramhound,不,这是软件中的错误(已确认)。当以前的插件已经被加载并且实现了特定的命令ID时,加载插件不会失败。为什么?因为多个插件应该能够运行由该ID定义的命令。现在得到它? –

0

这两个类的构造函数是否被调用?还是只是拳头类初始化?
请尝试添加(静态)构造函数以检查哪些类被初始化。

静态构造函数一类:

public class class2 : interface2 
{ 
    static class2(){ 
     messagebox.show("Static Constructor from class2"); 
    } 

    public void Initialize() 
    { 
     messagebox.show("initialize from class2"); 
    } 
} 
+0

我不得不认为他们都叫,因为再次,这在VB工作正常....对吧?或者我错过了什么?你会在哪里把静态构造函数?哪一堂课? –

+0

我会尝试在这两个类中的静态构造函数,只是为了确保:-) 也许你有你的C#程序集的问题,只有一个类可以找到。 这两个类在同一个程序集中吗? 他们是生产代码还是缩短形式? 如果我猜对了类的反射调用,所以它的AddIn模型或? – oberfreak

+0

如果你给我一个静态构造函数的例子,请试试:)而且,对于每个项目,这两个类都在同一个程序集中。这些类不会被反射调用。这些项目是由另一个应用程序作为插件加载的DLL。 –