Как скрыть не-CLS-совместимый код от проектов, использующих другие языки? - PullRequest
3 голосов
/ 12 марта 2011

Этот вопрос скорее из любопытства, чем из-за требования проекта или проблемы.

У меня есть код, не совместимый с CLS, на одном языке (скажем, C #), и мне нужно использовать его таким образом, только на моем текущем языке (в разных проектах, поэтому сделать внутренний не вариант), и в то же время хотите, чтобы другие языки (например, 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

Проблема: мне нужно избежать ошибки времени компиляции, скрыв один из моих методов печати от кросс-языковых проектов (позволяя проектам C # вызывать нужную реализацию).

Спасибо за ваш интерес.

Ответы [ 3 ]

3 голосов
/ 12 марта 2011

Язык, подобный VB.NET, не предлагает обхода своего основного правила синтаксиса, согласно которому идентификаторы не чувствительны к регистру. Это не трудно решить, вы можете просто написать небольшой метод статического адаптера на чувствительном к регистру языке, таком как C #, который выполняет вызов.

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

Вы можете полностью засунуть его под половик, сделав его методом расширения, предполагая, что язык поддерживает это. Когда с ним будет работать jit-оптимизатор, не будет никаких фактических затрат времени выполнения.

1 голос
/ 12 марта 2011

Я не вижу смысла пытаться заставить эту работу. Мой совет - во-первых, избежать этой проблемы и прекратить писать несовместимый код, особенно если вы планируете поддерживать разные языки. Здесь у вас есть полный контроль над модулем, поэтому вам не нужны какие-либо модные хаки.

1 голос
/ 12 марта 2011

Я бы посоветовал вам сделать не-CLS-совместимые методы / свойства internal, но затем создать другой класс, не совместимый с CLS, для вызова этого материала и пометить этот класс как [CLSCompliant(false)]

...