2013-02-06 2 views
13

Я довольно новичок в C# и сделал класс, который хотел бы использовать в своем основном классе. Эти два класса находятся в разных файлах, но когда я пытаюсь импортировать один в другой с using, CMD говорит говоритC# импортирующий класс в другой класс не работает

Тип или пространство имен имя «MyClass» не может быть найден (вы пропали без вести с помощью директивы или ? ссылка на узел

Я знаю, что в 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 

EDIT: Вот как файлы должны выглядеть следующим образом:

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

Если они являются отдельными файлами класса в рамках одного проекта, то вы не нужно иметь оператор «import». Просто используйте класс прямо. Если файлы находятся в отдельных проектах, вам нужно сначала добавить ссылку на проект, прежде чем вы сможете использовать на нем выражение «import».

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; 
Смежные вопросы