如何在VB代码中调用C#扩展方法

Gre*_*g B 10 c# vb.net extension-methods class-library

我有一个类库,其中包含一些用C#编写的扩展方法和一个用VB编写的旧网站.

我想从VB代码调用我的扩展方法,但它们没有出现在intelisense中,当我访问该站点时出现编译错误.

我已经获得了所有必需的Import,因为同一名称空间中包含的其他类在Intelisense中看起来很好.

有什么建议

编辑:更多信息,以帮助一些评论.

我的实现看起来像这样

//C# code compiled as DLL
namespace x.y {
    public static class z {
        public static string q (this string s){
             return s + " " + s;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

和我这样的用法

Imports x.y

'...'
Dim r as string = "greg"
Dim s as string = r.q() ' does not show in intelisense
                        ' and throws error : Compiler Error Message: BC30203: Identifier expected.
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

它对我有用,虽然有一些怪癖.首先,我创建了一个面向.NET 3.5的C#类库.这是项目中唯一的代码:

using System;

namespace ExtensionLibrary
{
  public static class Extensions
  {
    public static string CustomExtension(this string text)
    {
      char[] chars = text.ToCharArray();
      Array.Reverse(chars);
      return new string(chars);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个面向.NET 3.5的VB控制台应用程序,并添加了对我的C#项目的引用.我将Module1.vb重命名为Test.vb,这里是代码:

Imports ExtensionLibrary

Module Test

    Sub Main()
        Console.WriteLine("Hello".CustomExtension())
    End Sub

End Module
Run Code Online (Sandbox Code Playgroud)

这编译并运行.(我本来会调用方法Reverse()但是我不确定VB是否可能已经在某处神奇地具有反向能力 - 我不是一个长期粉笔的VB专家.)

最初,我没有提供ExtensionLibrary作为Intellisense的导入.即使在构建之后,"Imports ExtensionLibrary"也会变灰,并且灯泡提供了删除所谓冗余导入的机会.(这样做会破坏项目.)请注意,这可能是ReSharper而不是Visual Studio.

所以简而言之,可以做到,它应该可以正常工作.我不认为问题是您要么使用旧版本的VB,要么您的项目不是针对.NET 3.5?

正如评论中所述:还有一个额外的怪癖,即当目标的编译时类型时,将找不到扩展方法Object.