2010-01-22 110 views
5

我有一个vb.net解决方案,我想添加一个用c#编写的新dll文件,并使用vb.net编写的代码中的dll功能。将VB.net代码与c#代码混合

我做了它的几个用途,它似乎工作好吧, ,但它是一个聪明的事情做cb乱码vb.net代码像我想要做的。

我在做什么的危险?

非常感谢您的帮助。

回答

11

你的DLL不是C#DLL,它是一个.NET DLL。一旦编译完成,你拥有的就是IL - 不管它来自哪种语言。应该没问题,除非遇到其中一个奇怪的边界情况,其中DLL的接口包含某些不受Visual Basic支持的内容。但这将是一个非常有边缘的案例。

公共语言规范(CLS)定义了.NET语言必须支持的.NET功能的子集,如果您的DLL符合CLS,则可以毫无问题地使用它。如果你对CLS,CTS,CLR等之间的区别感到困惑,那么我发现它的覆盖范围在this book中很有帮助,尽管它主要是C#书。

+0

OP询问这是*正确的事情*,因为它已经有了这种语言组合 – 2010-01-22 14:33:33

+1

这是95% - 99.99%是真实的,但不是100%真实。这就是为什么有一个共同语言规范。将DLL标记为符合CLS,并且应该100%保证您可以从任何CLS语言(如VB.Net)调用它。 http://stackoverflow.com/questions/2117776/mixing-vb-net-code-with-c-code/2117937#2117937 – MarkJ 2010-01-22 14:44:17

+0

@马克 - 谢谢,我明显没有在今天的所有汽缸射击。猜猜这就是我不工作的原因。无论如何,编辑了答案。 – 2010-01-22 14:48:51

3

您可以在同一个项目中混合使用VB和C#代码 - 我曾参与过几个混合使用并且没有问题的项目。

您的语言混合似乎更加孤立 - 一个解决方案包含多个C#DLL和vb项目。

我没有看到很多问题。

+6

当然你的意思是“相同的解决方案”?在一个项目中混合是行不通的。 – 2010-01-22 14:21:34

+0

它可以在ASP.NET“Web Site”项目中使用。 – 2010-01-22 14:31:11

+0

在同一个项目中可能有两种语言 - 只是不在同一个文件中。 – 2010-01-22 19:24:33

0

我认为最大的危险是让开发人员了解这两种语言;虽然C#和VB.NET是相似的,因为它们绑定到.NET框架,但它们有一些特殊之处。

你会发现很多很好的C#程序员和许多好的程序员VB.NET,但可以是一个有点难以找到一个好的程序员语言

而且,看看这个文章:A Manager’s Retrospective on the C# versus VB.NET decision因为它谈论的其他项目要记住,作为开发人员的偏好,语言功能和招聘。

+0

不是我,也不是那个在那个项目上工作的程序员,根本不知道vb语言。所以我们真的想转移到c#。 – 2010-01-22 14:25:44

+0

您可以参考vb.net程序集,就像您已经在做的那样,并尝试花时间与您的老板一起创建一种使用单一语言的解决方案;你可以辩解说生产力 – 2010-01-22 14:28:31

1

一个解决方案被发现here

然而,有可能在一个单一的 项目中使用 不同的语言。您可能需要编写命令 行构建文件来构建项目。 在.NET框架SDK中,有一个 示例。您可以在 C:\ Program Files \ Microsoft Visual Studio .NET \ FrameworkSDK \ Samples \ Technologies \ CrossDevLan 中进行访问。

此示例演示在单个项目中使用 不同的开发语言 单个项目。本示例创建两个组件。第一个是库 或DLL程序集,它定义了一个简单的 基类,以C++的托管 扩展名编写。第二个 程序集是一个可执行程序集 ,它定义了用C#,VB和IL编写的三个派生类 (中级语言)。这些类型 相互派生,最终从基类中派生出 ,这些基类写成托管的 C++。最后,可执行文件创建 的每个派生类型的 实例,并为每个派生类型调用一个虚拟方法。 .NET框架是一个环境 ,其中各种开发人员可以将 无缝地组合在一起,同时以其选择的语言开发 。

但是,您可以在asp.net应用程序中同时使用VB.NET和C#代码。

您需要创建在App_Code文件夹中两个文件夹(如vbFolder和csFolder),并在web.config中写代码:

<system.web>  
<compilation>  
<CODESUBDIRECTORIES>  
<ADD directoryName="vbFolder" />  
<ADD directoryName="csFolder" />  
</CODESUBDIRECTORIES>  
</compilation>  
</system.web> 

很好的解释是here

0

这两个VB.NET & C#编译为MSIL(微软中间语言)而非本地代码,并通过现有的.NET框架工作完成对最终用户计算机上本机(机器)的完整编译。最终用户机器,所以如果它是用于操作系统x的.NET,那么对于操作系统x,您的程序应该可以正常工作,并且如果它是操作系统,那么您的应用程序应该可以在OS y下正常工作,并且这是.NET技术附带的解决方案让.NET应用程序操作系统依赖于。

还有一个COM Marshaler服务来支持旧的组件(控件)与.NET应用程序一起工作,所以例如您可以在C#windows应用程序中调用vb6控件(* .ocx)。

这是Microsoft技术和技术之间的巨大集成。

,并没有必要有两个VB.NET和C#开发好,但如果你需要一个什么办法,我在这里:)

但问题是,为什么我在两者兼而有之?

这只是因为我提供了培训,所以我想扩大我的能力,我很惊讶他们都非常接近,除了语法。

5

将您的代码标记为符合CLS,然后如果您执行任何可能导致您的DLL从另一个.Net语言调用时出现问题的C#编译器将警告您。

从MSDN

一些报价

要与其他物体 不管他们 实施了语言的充分互动,对象必须暴露在 呼叫者仅是共同 他们必须在所有语言的功能 互操作。已经定义了 Common Language Specification (CLS),它是许多 应用程序所需的一组基本 语言功能。

您可以使用CLSCompliantAttribute将程序集,模块, 类型和成员标记为符合CLS标准。

一些符合CLS的语言编译器, such as the C# compiler,使您能够 指定您希望您的代码以 是符合CLS。这些编译器可以通过 检查CLS符合性,并让您知道您的代码何时使用CLS不支持的功能 。

此外,您的组织现在需要C#技能以及Vb.Net技能。你也许应该说服自己,这是好的,然后说服关键的决策者。