6

我有一个用 C# 编译的类项目 a.dll。它包含以下代码。

public class MyClass{
    public int Add(int i,int j)
    {
      return (i+j);
    }

    public int add(int i,int j)
    {
      return (i+j)*2;
    }
}

从 C# 项目中,我可以像这样调用这些函数

public class MyOtherClass{
 MyClass mcls=new MyClass();
 mcls.Add(1,2);
 mcls.add(2.3);
}

但是我怎么能从 a 中调用它VB.Net Project?我现在无法使用 Visual Studio。因此,如果有人会提供答案,那将非常有帮助。

编辑 1

我有一个 VB.NET 项目,我需要添加 C# dll ( say dll contains MyClass) 的引用。这样我就可以调用两个方法 ( Add(int,int) , add(int,int))。但在 VB.NET 中,这是区分大小写的。有没有办法做到这一点?

编辑 2

假设我添加了对 dll 的引用,因此我可以调用这些函数。

Dim myObj as New MyClass
myObj.Add(1,2)
myObj.add(1,2)

如果此代码有效,编译器如何识别正确的函数?

4

3 回答 3

5

您最好的选择是在这里使用反射 - VB 根本无法确定您正在调用哪个函数,因为在 VB 中“添加”与“添加”相同。

这是我为测试它所做的(我不确定您需要在此处组合哪个“BindingFlags”):

Dim mcls As New [MyClass]
Dim t As Type = mcls.GetType()
Dim x = t.InvokeMember("add", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, mcls, New Object() {1, 2})
Dim y = t.InvokeMember("Add", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, mcls, New Object() {1, 2})
于 2013-06-13T01:11:48.400 回答
2

如果您的 C# 代码符合 CLS,您可以简单地将其引用添加到您的 vb.net project.namespace ,可以访问 DLL 中的公共成员


更多在这里
http://www.christec.co.nz/blog/archives/290

您也可以使用免费的在线转换工具。
例如: http: //www.developerfusion.com/tools/convert/vb-to-csharp/

更新:

阅读此http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/dda8d7cb-0fa1-43d6-a90f-6c4bed0b40bb

Dim c As New MyClass()
MsgBox(c.Add(1, 2)) 'if only Add() is Available


更新2: *根据上面的链接注意: *

此外,在 C# 项目中,将以下内容添加到AssemblyInfo.cs:

using System;

// etc

[assembly: CLSCompliant(true)]

更新3:

正如我上面所说,您要确保您的 C# 代码符合 CLS
C# 区分大小写,而 VB.NET 不区分大小写。您违反了 CLS 准则
请注意更新 2以确保合规性

终于找到了很久以前指导我的文章

http://www.devarticles.com/c/a/C-Sharp/Making-Your-Code-CLS-Compliant/

更新4:

另一个范围 http://msdn.microsoft.com/en-us/magazine/cc163750.aspx

于 2013-06-13T01:01:55.920 回答
1

实际上 VB 不会让你Add按名称调用任何一种方法。您将收到一个编译器错误,指示名称Add不明确。给两个仅按大小写不同的公共成员名称是不符合 CLS 的。打电话给编写 C# 类的人,告诉他们使用符合 CLS 的名称。如果他们不这样做,那么您将不得不诉诸反思。

于 2013-06-13T01:25:46.393 回答