2013-02-06 64 views
13

我對C#很陌生,並且已經創建了一個我想在我的主類中使用的類。這兩個類在不同的文件,但是當我嘗試導入到彼此與using,CMD表示說C#導入類到另一個類不起作用

類型或命名空間名稱「MyClass的」找不到(是否缺少using指令或?組件的參考

我知道,在Java中我惹CLASSPATH各地得到這樣的東西的工作,但我不知道C#的想法

其他細節:

正如你可能已經想通了,我正在編譯和通過命令提示符執行。我使用/target:library編譯我的非主類(我聽說只有主類應該是.exe-文件)。

我的代碼如下所示:

public class MyClass { 
    void stuff() { 

    } 
} 

和我的主類:

using System; 
using MyClass; 

public class MyMainClass { 
    static void Main() { 
     MyClass test = new MyClass(); 
     /* Doesn't work */ 
    } 
} 

我曾嘗試包括我的非主類namespace MyNamespace { }和進口一點,但它不工作。

+0

你通過生成的庫作爲輸入到編譯器在編譯的主類,對吧?另外,您應該能夠將兩個源文件一起傳遞給編譯器 - 這裏不需要庫。 – Alex

+0

您是否已將其他文件(MyClass所在的文件)添加到Visual Studio中的解決方案中? –

+1

@JensKloster有什麼解決方案?什麼視覺工作室?我沒有使用IDE,我正在使用命令提示符。 – Bluefire

回答

19

using僅適用於命名空間 - 如果兩個類都在同一個命名空間中,只需刪除using即可。

你必須在編譯的.exe引用在第一步中創建的組件:

csc /t:library /out:MyClass.dll MyClass.cs 
csc /reference:MyClass.dll /t:exe /out:MyProgram.exe MyMainClass.cs 

你可以讓事情變得更簡單,如果你只是將文件彙編在一起:

csc /t:exe /out:MyProgram.exe MyMainClass.cs MyClass.cs 

csc /t:exe /out:MyProgram.exe *.cs 

編輯: 這裏的文件應該怎麼樣子:

MyClass.cs

namespace MyNamespace { 
    public class MyClass { 
     void stuff() { 

     } 
    } 
} 

MyMainClass.cs

using System; 

namespace MyNamespace { 
    public class MyMainClass { 
     static void Main() { 
      MyClass test = new MyClass(); 
     } 
    } 
} 
+0

但是,當我將它們都放在同一個命名空間中時,當我嘗試使用它時,會發生完全相同的錯誤。 – Bluefire

+1

@Bluefire發佈你用來編譯它們的命令行和文件的內容,包括命名空間。 – Alex

+1

最佳答案,因爲它實際上提供了編譯命令行。原始海報將需要決定他是否想要兩個單獨的程序集中的類(編譯一個類到庫(DLL),然後編譯第二個類到可執行,並參考第一個編譯的DLL),或者只在一個程序集中編譯一次)。這是許多人通過在Visual Studio內部進行項目相互引用(非循環方式)的「項目」來管理的,每個項目都可以包含一個或多個代碼文件。 –

-1

你唯一能做的就是把它們放在同一個命名空間中。然後,你不需要導入它。你可以直接訪問它。

using System; 
namespace MyNamespace 
{ 
    public class SampleClass1 
    { 
     //Can access SampleClass2 here 
    } 
} 


using System; 
namespace MyNamespace 
{ 
    public class SampleClass2 
    { 
     //Can access SampleClass1 here 
    } 
} 

using System; 
namespace MyNamespace 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      //Can access both of above classes 
     } 
    } 
} 
+0

你:_你唯一能做的就是把它們放在同一個命名空間._不正確。不同名稱空間中的類型可以互相引用。這不是關於命名空間的,而是關於從命令行編譯多個代碼文件的。此外,名稱空間的概念與項目/模塊/組件的概念正交。 –

+0

@JeppeStigNielsen對不起,我的這個愚蠢的錯誤...但問題是在我回答後編輯的。以前,它是關於在主要方法中使用另一個類,並且提問者直接導入類,所以這是當時的正確答案。如果在當前上下文中錯誤,則可以編輯我的答案。謝謝您的正交概念.. !! –

1

那你要「導入」(使用)的是MyClass的命名空間而不是類名本身。如果兩個類都在同一個命名空間中,則不必「導入」它。

定義MyClass.cs

namespace Ns1 
{ 
    public class MyClass 
    { 
     ... 
    } 
} 

使用AnotherClass.cs

using Ns1; 

namespace AnotherNs 
{ 
    public class AnotherClass 
    { 
     public AnotherClass() 
     { 
      var myInst = new MyClass(); 
     } 
    } 
} 
0
namespace MyNamespace 
{ 
    public class MyMainClass 
    { 
     static void Main() 
     { 
      MyClass test = new MyClass(); 
     } 
    } 

    public class MyClass 
    { 
     void Stuff() 
     { 

     } 
    } 
} 

您有沒有必要使用一個命名空間則因爲它是所有在相同的命名空間encompased。

如果您不確定什麼名稱空間類的位置,鍵入類(區分大小寫您希望使用),然後用你的光標的類,使用CTRL + .,它會爲您提供一個手動導入。

0

MyClass不是命名空間。所以這個代碼是錯誤的:

using MyClass //THIS CODE IS NOT CORRECT 

您應該檢查MyClass的命名空間(例如:myNameSpace對象)。然後調用它以適當的方式:

MyNamespace.MyClass myClass =new MyNamespace.MyClass(); 
0

using用於導入命名空間而不是類。

所以,如果你的類是在命名空間X

namespace X 
{ 
    public class MyClass { 
     void stuff() { 

     } 
    } 
} 

然後用它在另一個命名空間中,你想讓它

using System; 
using X; 

public class MyMainClass { 
    static void Main() { 
     MyClass test = new MyClass(); 
    } 
} 
0

如果他們是在同一個項目中單獨的類文件,那麼你不需要有「進口」聲明。請直接使用課程。如果這些文件位於不同的項目中,則需要首先添加對該項目的引用,然後才能對其使用「導入」語句。

1

如果其它類被編譯爲一個庫(即一個DLL),這是你想要它,你應該添加從Visual Studio的參考,瀏覽並指向該DLL文件。

如果你想要的是在OtherClassFile.cs納入您的項目,命名空間已經是相同的,您可以:

  1. 閉上你的解決方案,
  2. 打開YourProjectName.csproj文件,並查找本節:

    <ItemGroup>            
        <Compile Include="ExistingClass1.cs" />      
        <Compile Include="ExistingClass2.cs" />         
        ... 
        <Compile Include="Properties\AssemblyInfo.cs" />  
    </ItemGroup> 
    
  1. 檢查您要添加的.cs文件是否在項目文件夾(與解決方案中所有現有類相同的文件夾)中。

  2. 在下面添加一個條目,保存並打開項目。

    <Compile Include="OtherClassFile.cs" /> 
    

你的班,現在將出現,表現爲項目的一部分。不需要使用。這可以一次完成多個文件。

5

我知道這是一個非常古老的問題,但我現在是在相同的要求,只是資源管理器,在c#6之後,你可以使用靜態在使用類導入。

希望這可以幫助別人....

using static yourNameSpace.YourClass;