您可以在同一项目中为类库混合vb和c#文件吗?是否有一些设置可以实现?
我尝试过,尽管背景编译器似乎能很好地处理它,但所有intellisense都无法正常工作(除了我在相同名称空间中具有相同名称的2个类而且没有抱怨的事实之外)。
我们正在尝试从VB转换为C#,但尚未完成所有代码的转换。我有一些新代码需要编写,但实际上并不想为此创建一个新项目。
您可以在同一项目中为类库混合vb和c#文件吗?是否有一些设置可以实现?
我尝试过,尽管背景编译器似乎能很好地处理它,但所有intellisense都无法正常工作(除了我在相同名称空间中具有相同名称的2个类而且没有抱怨的事实之外)。
我们正在尝试从VB转换为C#,但尚未完成所有代码的转换。我有一些新代码需要编写,但实际上并不想为此创建一个新项目。
Answers:
不,你不能。程序集/项目(每个项目通常编译为1个程序集)必须是一种语言。但是,您可以使用多个程序集,并且每个程序集都可以用不同的语言编码,因为它们都已编译为MSIL。
它编译良好,没有任何抱怨,因为VB.NET项目只会实际编译.vb文件,而C#项目只会实际编译.cs文件。它忽略了其他的,因此您没有收到错误。
编辑:如果将.vb文件添加到C#项目,请在“解决方案资源管理器”面板中选择该文件,然后查看“属性”面板,您会注意到“生成操作”是“内容”,而不是“编译”。它被视为简单的文本文件,甚至没有作为二进制资源嵌入到已编译的程序集中。
编辑:使用asp.net网站,您可以将c#Web用户控件添加到vb.net网站
好吧,实际上,几年前我从一个同事那里继承了一个项目,该同事决定在同一项目中混合使用VB和C#Web表单。那行得通,但是维护起来却很有趣。
我决定新代码应该是C#类,要使其正常工作,我必须在web.config的编译部分添加一个子节点。
<codeSubDirectories>
<add directoryName="VB"/>
<add directoryName="CS"/>
</codeSubDirectories>
所有VB代码进入App_Code中名为VB的子文件夹,而C#代码进入CS子文件夹。这将产生两个.dll文件。它可以工作,但是代码的编译顺序与“ codeSubDirectories”中列出的顺序相同,因此,如果同时在C#和VB中使用,则接口应位于VB文件夹中。
我在同时引用了VB和C#编译器
<system.codedom>
<compilers>
该项目当前已更新到框架3.5,并且仍然有效(但仍然没有维护的乐趣。)
您不能在同一项目中混合使用vb和c#-如果您在Visual Studio中注意到项目文件是.vbproj或.csproj。您可以在解决方案中-在vb中有1个项目,在c#中有1个项目。
看起来像这样,您可以在App_Code目录的Web项目中同时使用它们:
http://pietschsoft.com/post/2006/03/30/ASPNET-20-Use-VBNET-and-C-within-the-App_Code-folder.aspx
某些自定义MSBuild开发可能是可能的。提供的.targets强制项目使用单一语言-但是没有运行时或工具方面的限制。
VB和CS编译器都可以输出到模块 -.obj文件的CLR版本。使用程序集链接器,您可以从VB和CS代码中提取模块并生成单个程序集。
并不是说这会是一件小事,但可能会奏效。
演练:在网站项目中使用多种编程语言 http://msdn.microsoft.com/zh-cn/library/ms366714.aspx
默认情况下,App_Code文件夹不允许多种编程语言。但是,在网站项目中,您可以修改文件夹结构和配置设置以支持多种编程语言,例如Visual Basic和C#。这样,ASP.NET可以创建多个程序集,每种语言一个。有关更多信息,请参见ASP.NET Web项目中的共享代码文件夹。开发人员通常在Web应用程序中包含多种编程语言,以支持独立运行并喜欢不同编程语言的多个开发团队。
尽管Visual Studio不支持此功能(您可以做一些技巧,让MSBuild编译两者,但不能从Visual Studio内部编译),但SharpDevelop可以。您可以将两者都放在同一个解决方案中(只要您正在运行Visual Studio Professional及更高版本),因此,如果要继续使用Visual Studio,最简单的解决方案是将VB代码分离到另一个项目中,并以这种方式进行访问。
用鼠标右键单击该项目。选择添加Asp.Net文件夹。在“文件夹”下,创建两个文件夹,一个名为VBCodeFiles,另一个CSCodeFiles在Web.Config中添加正在编译的新元素。
<compilation debug="true" targetFramework="4.5.1">
<codeSubDirectories>
<add directoryName="VBCodeFiles"/>
<add directoryName="CSCodeFiles"/>
</codeSubDirectories>
</compilation>
现在,创建一个cshtml页面。使用以下命令添加对VBCodeFiles.Namespace.MyClassName的引用
@using DMH.VBCodeFiles.Utils.RCMHD
@model MyClassname
其中MyClassName是在上述命名空间中找到的类对象。现在使用cshtml文件在razor中写出对象。
<p>@Model.FirstName</p>
请注意,如果这是C#项目,则directoryName =“ CSCodeFiles”是多余的;如果这是VB.Net项目,则directoryName =“ VBCodeFiles”是多余的。
正如其他人所说,您不能将两者都放在一个项目中。但是,如果您只是想用另一种语言包含在项目中的一小段C#或VB代码,则可以使用自动转换工具。它们不是完美的,但它们做得很好。另外,SharpDevelop内置有一个转换实用程序。
在我们的方案中,它是单个解决方案中的单个VB.NET项目(Windows桌面应用程序)。但是,我们想利用C#功能,例如VB.NET中的有符号/无符号整数和XML文字以及字符串功能。因此,根据功能,在运行时我们将构建代码文件,使用各自的Rosalyn编译器(VB / CS)编译为DLL,然后动态加载到当前程序集中。当然,我们必须进行动态DLL的链接,卸载,重新加载,命名等工作,并且我们在很大程度上使用动态GUID进行命名以避免冲突,从而进行了内存管理。在应用程序用户可以从我们的桌面应用程序连接到任何数据库,编写SQL查询,将连接转换为LINQ连接以及编写LINQ查询的情况下,都可以很好地工作,所有这些都需要动态构建源代码,编译为DLL并附加到当前程序集。