【问题标题】:How to call a function defined in C# with same params,return type and same name but in different case from a VB.NET project如何调用在 C# 中定义的具有相同参数、返回类型和相同名称但在不同情况下与 VB.NET 项目的函数
【发布时间】:2013-06-13 00:55:28
【问题描述】:

我有一个用 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);
}

但是我如何从 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)

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

【问题讨论】:

  • 为什么不把 add 重命名为 AddAndDouble?
  • +1 好逻辑!但违反 CLS 准则

标签: c# .net vb.net c#-to-vb.net


【解决方案1】:

您最好的选择是在这里使用反射 - 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})

【讨论】:

  • 我只是稍微简化了一下——你不需要单独的程序集加载——它已经加载了,所以只需使用“GetType”。
  • 谢谢。这是一个正确的答案。
【解决方案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 准则
请注意update2以确保合规性

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

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

更新4:

另一个作用域 http://msdn.microsoft.com/en-us/magazine/cc163750.aspx

【讨论】:

  • 我添加了参考以及如何调用函数?
【解决方案3】:

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

【讨论】:

  • 同意您的意见。 +1 :) 这个问题是问我朋友的面试问题,他和我一起检查了解决方案。谢谢
  • @VeeKayBee 如果我得到这份工作,请告诉我 :)
  • 当然。他被选中了,但他不知道他的问题的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2013-02-28
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多