2010-07-23 32 views
3

我有一個ASP.NET網站項目,我使用VB.Net和C#類文件。我在App_Code目錄中爲每種語言的類添加了單獨的子文件夾。但是,雖然我可以成功地在VB類中使用C#類,但我不能做相反的事情:在C#類中使用VB類。在C#類中使用同一ASP.NET網站項目中的VB類

所以,爲了說明問題,我可能有兩個類,比如這個:

Public Class VBTestClass 
    Public Sub New() 
    End Sub 

    Public Function HelloWorld(ByVal Name As String) As String 
     Return Name 
    End Function 
End Class 

public class CSTestClass 
{ 
    public CSTestClass() 
    { 
    } 
    public string HelloWorld(string Name) 
    { 
     return Name; 
    } 

} 

我可以利用CS類的在我的VB類中,與「進口」的聲明。所以這個工作得很好:

Imports CSTestClass 
Public Class VBTestClass 
    Public Sub New() 
    End Sub 

    Public Function HelloWorld(ByVal Name As String) As String 
     Return Name 
    End Function 

    Private Sub test() 
     Dim CS As New CSTestClass 
     CS.HelloWorld("MyName") 
    End Sub 
End Class 

但利用VB的類在我的C#,與「使用」的聲明,不工作:

using VBTestClass; 
public class CSTestClass 
{ 
     public CSTestClass() 
     { 
    } 

    public string HelloWorld(string Name) 
    { 
     return Name; 
    } 
} 

我得到一個錯誤「的類型或命名空間「VBTestClass」無法找到「。我在這裏錯過了什麼?

回答

0

using語句是命名空間不是類名,把VBClass一個命名空間中,然後使用 「使用」 的語句:

Namespace MyFoo 
Public Class VBTestClass 
    Public Sub New() 
    End Sub 

    Public Function HelloWorld(ByVal Name As String) As String 
     Return Name 
    End Function 
End Class 
End Namespace 

現在在C#:

using MyFoo; 

... 
+0

我試過這個,但是我得到了同樣的問題「type或namespace not found」...... ??? – 2010-07-23 14:43:33

0

的區別是關鍵字Importsusing關鍵字相比的工作原理。

using關鍵字只能用於指定名稱空間,而Imports關鍵字也可用於指定類。

因此,Imports CSTestClass指定該類中的類,接口和枚舉應該可用,但該類不包含任何這些,因此不需要Imports語句。

當您嘗試使用using VBTestClass時,它不起作用,因爲VBTestClass不是一個名稱空間。

所以,只要刪除Importsusing聲明,它應該工作正常。由於班級在同一集會上,他們已經瞭解對方。

+0

非常感謝 - 非常有用的信息。但是,我試圖將VB類包裝在命名空間中(根據前面的答案),並刪除Imports和Using語句(只是假設他們會知道對方在其中相同的組件)。但是,我仍然遇到同樣的問題... – 2010-07-23 14:45:01

1

查看使用/ Imports作爲跳過完全限定名稱空間的快捷方式的最佳方法。行爲在vb和c#中是相同的。

考慮例子:

完全qualyfying:

void DoSomething() 
{ 
    var p = new Interfaces.CPDATA.DataHolders.Placement(); 
} 

跳過命名空間:

using Interfaces.CPDATA.DataHolders; 
void DoSomething() 
{ 
    var p = new Placement(); 
    var t = new Trade(); 
}  

和一點點快捷招

using data = Interfaces.CPDATA.DataHolders; 
void DoSomething() 
{ 
    var p = new data.Placement(); 
    var t = new data.Trade(); 
} 

和替換招:

using t = Interfaces.CPDATA.DataHolders.Placement; 
void DoSomething() 
{ 
    var p = new t(); // happy debagging 
} 

至於在ASP.NET App_Code文件夾中不同語言的代碼文件:請勿使用它。適用於:

  • 他們不會使用持續集成項目CSC或VBC編譯器的Visual Studio
  • 之外時使用Web應用程序項目
  • 他們將無法編譯時和工作,他們通常會給你很多在基礎設施方面的痛苦。

最好的方法是爲各種語言創建單獨的類庫項目並使用它們。

在它的上面也有很多有趣的東西會從Visual Studio和IIS下運行這樣的項目時,上。如果你很好奇,你可以看看各種文件坐在

\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\{project name}\{tempname} 

它應該給你一個好主意,asp.net引擎如何結合的代碼文件aspx頁面。

針對與無用信息,我們現在可以告訴大家,有在同一個命名空間聲明「進口CSTestClass」一CSTestClass類是不是真的有用。良好的編碼風格應該是將它們全部包裝在命名空間語句MyWebProject.VbCode和MyWebProject.CsCode中。然後,「使用MyWebProject.VbCode」和「Imports MyWebProject.CsCode」語句對編譯器更有意義。

2

我想我發現了這個問題,似乎沒有反射,你不能做它作爲交叉引用。

原因很簡單,取決於您定義codeSubDirectories的訂單怎麼樣,我想你做這樣說:

<codeSubDirectories> 
    <add directoryName="CSCode"/> 
    <add directoryName="VBCode"/> 
</codeSubDirectories> 

正如我們所知道的每個目錄將建立不同的組件,它們會根據您的設置從上到下逐個構建。

所以當你有CSCode文件夾定義首先,它會被首先建立,然後編譯開始建立VBCode,所以使用CS類是OK,因爲它可以找到引用的程序集。

但是,如果你這樣做反向,因爲你提到的引用在CS VB代碼,它首先建立CSCode文件夾,並在那個時候VBCode的組件不存在,所以拋出異常。

因此,對於使之與使用VB CS工作,只是簡單地更改文件夾設置順序:

<codeSubDirectories> 
    <add directoryName="VBCode"/> 
    <add directoryName="CSCode"/> 
</codeSubDirectories> 

但隨後你將無法使用任何CS類VB作爲這次VBCode編譯第一的能力。

所以我的建議是用反射去加載它在運行時,以便編譯器可以讓你走。

希望我的解釋清楚。

謝謝

相關問題