문제

내가 있는 클래스 라이브러리와 몇 가지 방법 확장에서는 오래된 웹 사이트에서 작성 VB.

내가 원하는 내장 방법 VB 코드 그러나 그들은 나타나지 않에 intelisense 고 나는 오류를 컴파일 할 때 저는 이 사이트를 방문하십시오.

내가 모든 필요한 가져오기s 기 때문에 다른 클래스에 포함되는 동일한 네임스페이스에서 잘 나타나는 Intelisense.

어떤 제안

편집: 더 많은 정보에 도움이 일부 의견.

나의 구현은 다음과 같이

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

    }
}

고 내용처럼 이

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.
도움이 되었습니까?

해결책

몇 가지 기발한 것이 있지만 그것은 저에게 효과적입니다. 먼저 .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);
    }
  }
}

그런 다음 .NET 3.5를 대상으로하는 VB 콘솔 앱을 만들고 C# 프로젝트에 대한 참조를 추가했습니다. test.vb로 module1.vb로 이름을 바꿨습니다. 코드는 다음과 같습니다.

Imports ExtensionLibrary

Module Test

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

End Module

이것은 컴파일하고 실행됩니다. (나는 Method Reverse ()를 불렀을 것입니다. 그러나 VB가 이미 어딘가에 리버스 능력을 마술처럼 가지고 있는지 확실하지 않았습니다. 저는 긴 분필로 VB 전문가가 아닙니다.)

처음에는 Intellisense의 수입으로 Extensionlibrary를 제공하지 않았습니다. 건축 후에도 "Emports Extensionlibrary"는 회색이되며 Lightbulb는 중복 수입을 제거 할 수있는 기회를 제공합니다. (이렇게하면 프로젝트를 깨뜨립니다.) 이것은 Visual Studio보다는 재 샤퍼 일 가능성이 있습니다.

따라서 긴 이야기를 짧게 자르려면 수행 할 수 있으며 잘 작동해야합니다. 문제가 이전 버전의 VB를 사용하고 있거나 프로젝트가 .NET 3.5를 대상으로하지 않는다고 생각하지 않습니까?

의견에 언급 한 바와 같이 : 추가로 한 가지 추가가 있습니다. 대상의 컴파일 타임 유형이 Object.

다른 팁

확장 방법은 정적 방법을위한 구문 설탕 일뿐입니다. 그래서

public static string MyExtMethod(this string s)

vb.net과 c#에서 호출 할 수 있습니다.

MyExtMethod("myArgument")

확인. 오류 메시지를 기반으로합니다 ~ 아니다 가장 최근의 VB 버전 (vb 9!)을 사용하거나 오류는이 문제와 전혀 관련이 없습니다. 왜냐하면 메소드가 찾을 수없는 경우 다른 오류가 발생할 수 있기 때문입니다.

오류 1 'Q'는 'String'의 구성원이 아닙니다.

Imports x.y

'...'
Dim r As String = "greg"
Dim s As String = r.q() 'same as z.q(r) 

유사한 문제가 발생:VB.Net 아주 행복하게 컴파일을 통해 확장 방법 및 그들을 떠나 유추할 수 있도록 실행하는 경우 Option Strict 이 꺼져 있습니다.

그러나,VB.Net 정말하지 않는 것 처럼 확장자 방법에 기본적인 유형입니다.을 연장할 수 없습 Object 고 그것을 해결할 수 없는 경우에 당신은 그것을 해:

C#

namespace NS
...

public static class Utility {

    public static void Something(this object input) { ...

    public static void Something(this string input) { ...

}

// Works fine, resolves to 2nd method
"test".Something();

// At compile time C# converts the above to:
Utility.Something("test");

그러나이에서 잘못 VB.Net:

Option Infer On
Option Explicit On
Option Strict Off
Imports NS
...

    Dim r as String = "test" 
    r.Something()

컴파일이 오류 없이,하지만 실행된 시간에 실패할 때 Something 하지 않은 방법 String -컴파일러가지 못했을 대체한 구문 설탕의 확장자는 방법으로 정적화 Utility.Something.

문제는 이유는?과 달리 잘 C# VB.Net 처리할 수 없습니다 어떤 확장 Object!유효한 연장 방법 C#이 혼란 VB.Net 컴파일러입니다.

일반적으로 VB.Net 규칙,나는 사용하지 않는 확장과 방법의 기본입니다.Net 형식(Object, String, Integer,etc.).당신은 또한주의해야 Option Infer 으로 하는 동안 그것은 기본적으로 Visual Studio 에서 그것을 위해 기본적으로 컴파일 명령행, VBCodeProvider, 가능 웹 사이트(에 따라 귀하의 웹입니다.config).을 때 그것의 모든 것에 VB.Net 로 간주됩 Object 고 모든 연장 방법 남아 있을 것입니다 때까지 실행 시간(따라서 실패하).

내가 생각하는 Microsoft 진짜로 떨어졌을 때 그들은 추가된 확장하는 방법 VB.Net 내 생각에는 군더더기를 시도(fail)to make it consistent with C#.

C#에서와 동일한 도트 표기법으로 호출 할 수 있는지는 모르겠지만 정적 확장 메소드는 연장 유형으로 주먹 인수를 가진 정적 함수로 표시 될 것이라고 생각합니다. 따라서 실제로 VB의 클래스를 다음과 같이 호출 할 수 있어야합니다.

StaticClass.ExtensionMethod(theString, arg1, ..., argN)

C#에서 방금 작성했을 것입니다.

theString.ExtensionMethod(arg1, ..., argN);

staticclass가 확장 방법을 정의한 정적 클래스의 이름입니다.

… 그리고 vb로 작성된 오래된 웹 사이트.

여기서“오래된”이 여기에 기존 VB를 사용한다는 것을 의미합니까? 어쨌든, 확장 방법은 바닐라 정적이기 때문에 (“”Shared”) 방법 속성으로 장식 된 방법, 당신 ~해야 한다 어쨌든 전화 할 수 있습니다.

이 불가능한 경우 이전 버전의 VB에서 "확장 스타일"을 호출하거나 C# 어셈블리의 잘못된 버전을 참조하려고합니다.

편집 : 당신은 확실합니까? Importing 전부의 네임 스페이스, 즉 x.y 그리고 단지 x? VB는 C#보다 중첩 네임 스페이스에 쉽게 액세스 할 수 있으므로 네임 스페이스에서 클래스를 사용할 수 있습니다. x.y VB에서 다음 코드 사용. 그러나 확장 방법은 작동합니다 가득한 길은 있어야합니다 Import에드.

Imports x
Dim x As New y.SomeClass()

확인해야 할 두 가지 :

  1. .NET 3.5를 목표로하고 있습니다
  2. 당신은 DLL을 참조하고 있습니다

일부 도구는이를 지원하지 않는 프로젝트에 대한 확장 방법을 잘못 제안 할 수 있습니다.

나는 같은 문제에 부딪 쳤고 실수로 해결책을 우연히 발견했을 수도 있습니다. 내가 사용했다면

x.y.r.q()

, 그것은 나에게도 같은 오류를 던졌습니다. 그러나 XY를 가져 오면 효과가있었습니다.

using x.y;
...
r.q()

괜찮 았어.

따라서 분명히 당신은 그것을 작동시키기 위해 선언에서 가져와야합니다.

이것은 꽤 오래 전이었고 실제로 어떻게 해결했는지는 할 수는 없지만 말할 것도없이, 그것은 사용자 오류였습니다. 나는 아마 내 컴퓨터를 다시 시작했고 멀리 갔다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top