2011-09-30 72 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。 –