Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现一个接口,然后调用Initialize()函数_C#_Vb.net - Fatal编程技术网

C# 实现一个接口,然后调用Initialize()函数

C# 实现一个接口,然后调用Initialize()函数,c#,vb.net,C#,Vb.net,这将不容易解释清楚,但这里是 我有一些东西在VB中可以很好地工作,但在C#中不行 我有两个类,每个类实现一个不同的接口。每个接口都公开一个Initialize()函数,该函数在加载插件时应自动调用。因为每个类都有一个Initialize()函数,所以我可以在日志中看到这两个函数都被调用。这在VB中运行良好 当我在C#中执行同样的操作时,只调用第一个类中的Initialize()。有人知道为什么会发生这种情况吗 vb代码: Public Class class1 Implements In

这将不容易解释清楚,但这里是

我有一些东西在VB中可以很好地工作,但在C#中不行

我有两个类,每个类实现一个不同的接口。每个接口都公开一个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#代码:


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

这两个类的构造函数都被调用了吗?还是只初始化了第一个类
请尝试添加(静态)构造函数以检查初始化了哪些类

一个类的静态构造函数:

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

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

谢谢大家的帮助!原来问题出在调用代码中。长话短说,每个插件都有一个命令ID作为接口的一部分。在本例中,两者都具有ID 1000。当调用代码循环加载插件时,如果它看到重复的ID,它将跳过该插件。我的问题是,我在同一时间加载了具有相同ID的其他插件。你们都帮助在调用代码(这是非常有名的软件)中发现了一个bug,所以谢谢

你能分享调用初始化函数的代码吗?很遗憾,我没有访问调用代码的权限。开发人员只是提供给我使用的接口。如果你有某种想法,我可以把它传给他们看。那么你的第二个类就不会被库/调用代码加载。检查您的配置,您是否以某种方式让调用代码知道您的
class2
类的存在?@Zasz为什么它在VB中工作?调用代码调用接口方法Initialize()。在C#中,只调用一次类的Initialize。在VB中,两者都被调用。只需大声思考。。在c#?中可能是一个cassing问题?我必须假设它们都被调用了,因为同样,这在VB中运行良好。。。。正确的?还是我遗漏了什么?你要我把静态构造函数放在哪里?哪个类?我会在这两个类中尝试静态构造函数,只是为了确定:-)也许你的c#汇编有问题,只能找到一个类。这两个类在同一个程序集中吗?它们是生产代码还是缩写形式?如果我猜对了,类是通过反射调用的,那么它是一个AddIn模型,或者?如果你给我一个静态构造函数的例子,我会试试:)是的,对于每个项目,类都在同一个程序集中。这些类没有被反射调用。这些项目是DLL,由另一个应用程序作为插件加载。你们都帮助在调用代码(这是非常有名的软件)中发现了一个bug,所以谢谢你们!这不是一个错误。当然有人会争辩说,加载扩展的软件应该给它分配一个识别号。@Ramhound,不,这是软件中的一个bug(已确认)。当已经加载了实现特定命令ID的前一个插件时,加载插件不应该失败。为什么?因为多个插件应该能够运行由该ID定义的命令。现在获取它吗?
public class class2 : interface2
{
    static class2(){
        messagebox.show("Static Constructor from class2");
    }

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