如何使用其他语言隐藏来自项目的非CLS兼容代码?

时间:2011-03-12 17:02:41

标签: c# .net vb.net cls-compliant

这个问题更多是出于好奇而不是项目要求或问题。

我有一种语言的非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

问题:我需要通过某种方式从交叉语言项目中隐藏我的一个“print”方法来避免编译时错误(允许C#项目调用所需的实现)。

感谢您的关注。

3 个答案:

答案 0 :(得分:3)

像VB.NET这样的语言无法摆脱其基本语法规则,即标识符不区分大小写。要解决这个问题并不难,您可以简单地在一个区分大小写的语言中编写一个静态适配器方法,如C#进行调用。

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

假设语言支持,你可以将它作为一种扩展方法完全推到门垫下面。当jit优化器完成后,将没有实际的运行时开销。

答案 1 :(得分:1)

我建议您制作非CLS兼容的方法/属性internal,但是然后创建另一个不符合CLS的类来调用那些东西并将标记为[CLSCompliant(false)]

答案 2 :(得分:1)

我没有看到尝试使这项工作的重点。我的建议是首先避免这个问题并停止编写不合规的代码,特别是如果你打算支持不同的语言。你可以在这里完全控制模块,所以你实际上不需要任何花哨的黑客。