3

この質問は、プロジェクトの要件や問題よりも好奇心からのものです。

1つの言語(C#など)で非CLS準拠のコードを使用していて、現在の言語でのみ(プロジェクト全体で、内部を作成することは選択できません)、そのように使用する必要があります。同時に、許可する必要があります。コンパイル時エラーを生成せずに競合する実装を呼び出すことができる他の言語(VBなど)。

例えば、

//C#
public class SecurityService
{
....
    public void Print()
    {
        Console.WriteLine("print"); //This method prints Service Name in lower case
    }

    public void PRINT()
    {
        Console.WriteLine("PRINT");//This method prints service name in UPPER case.
    }
}
'VB.Net 

Module ServiceReader

    Sub Main()
        Dim service As New SecurityService()
        service.print() 'Compile time error: print is ambiguos
    End Sub

End Module

問題:クロスランゲージプロジェクトから「print」メソッドの1つを何らかの方法で非表示にすることで、ここでコンパイル時エラーを回避する必要があります(C#プロジェクトが目的の実装を呼び出せるようにします)。

ご関心をお寄せいただきありがとうございます。

4

3 に答える 3

3

VB.NETのような言語は、識別子が大文字と小文字を区別しないという基本的な構文規則を回避することはできません。解決するのは難しいことではありません。呼び出しを行うC#のような大文字と小文字を区別する言語で、静的なアダプターメソッドを作成するだけです。

public static class Interop {
    public static void Print2(SecurityService obj) {
        obj.PRINT();
    }
}

言語がサポートしていると仮定すると、拡張メソッドにすることで、玄関マットの下に完全に押し込むことができます。jitオプティマイザーを使用すると、実際の実行時オーバーヘッドは発生しません。

于 2011-03-12T17:30:01.977 に答える
1

CLSに準拠していないメソッド/プロパティを作成することをお勧めしますが、internalCLSに準拠していない別のクラスを作成して、そのクラスを呼び出し、そのクラスを次のようにマークします。[CLSCompliant(false)]

于 2011-03-12T17:12:17.467 に答える
1

これを機能させようとする意味がわかりません。私のアドバイスは、特に異なる言語をサポートすることを計画している場合は、そもそも問題を回避し、非準拠のコードの記述をやめることです。ここではモジュールを完全に制御できるので、実際に派手なハックは必要ありません。

于 2011-03-12T17:15:39.957 に答える