首页 > 解决方案 > 尝试使用自定义类编译类会导致错误 CS0246

问题描述

我正在努力从命令行编译我的 C# 项目。我做了 2 个简单的类来呈现这个问题。我有一个Person类和一个Registry存储 Person 数组的类。当我尝试使用 csc 编译注册表文件时,我得到“ Registry.cs(4,5): error CS0246: The type or namespace name 'Person' could not be found (are you missing a using directive or an assembly reference?)

一段时间后我发现的一个笨拙的解决方法是将Person.cs文件编译为一个.dll文件(使用csc /target:library Person.cs),然后在我尝试编译时引用库文件Registry.cscsc /r:"./Person.dll" /out:test.exe Registry.cs)。这可行,但似乎根本不是正确的工作流程。如果你遇到过类似的情况,请帮忙。下面是这两个类的源代码。

个人.cs

using System;

namespace ClassTest {

public class Person {
    private string Name {set; get;} 
    private int Age {set; get;}

    public Person(string name, int age) {
        Name = name;
        Age = age;
    }

    public void GetInfo() {
        Console.WriteLine("Name: " + Name);
        Console.WriteLine("Age: " + Age + "\n");
    }
}

}

注册表.cs

using System;

namespace ClassTest {

public class Registry {
    Person[] citizens;

    public Registry() {
        citizens = new Person[2];
        citizens[0] = new Person("John", 30);
        citizens[1] = new Person("Mary", 22);
        foreach (Person p in citizens) {
            p.GetInfo();
        }
    }

    public static void Main() {
        Console.WriteLine("");
        Registry r = new Registry();
    }
}

}

标签: c#visual-studio-codecompiler-errorscompilationnamespaces

解决方案


我希望我能给你一个更好的答案,但问题似乎归结为你编译不是一个项目,只是一堆松散的 .cs 文件。

编译 Registry.cs 时,编译器不知道 Person.cs 中有什么,因此它无法确定您正在谈论的“Person”类型以及它具有的函数(包括所有重载)、属性和字段。这意味着它无法进行类型检查。更不用说将该类的真实 IL 名称放入代码中,以避免任何混淆。它会停止。

一段时间后我发现一个笨拙的解决方法是将 Person.cs 文件编译为 .dll 文件(使用 csc /target:library Person.cs

这就是它与您引用的所有那些 .NET 库(包括 System.dll)一起工作的方式。所有这些都已预编译,这就是为什么您可以在没有源代码的情况下使用它们。您现在可以在线查找他们的源代码,但这不是给定的。尤其是对于第 3 方 .dll,这很少是给定的。

我只能告诉你,当我学习 Native C++ 时,我们是如何做到的。我们使用 include 代替 usings。Wich 实际上更像是添加参考。我们必须在使用该类的每个文件中包含 Person.h。其中包括 Registry.h。但是 IIRC,每个文件也使用 Registry.h。这当然会导致使用 Registry.h 的文件重复,因为它有两个 Person-h - 一个本身,一个来自 Registery.h 的包含。通过预处理器的编译器方式可以解决这个问题,但速度很慢。因此,我们的每个代码文件都以这些预处理器指令开始和结束:

#ifndef CustomIdenfifer
#define CustomIdentifer
//Code
#endif

您可以在整个 Library Sorucefiles 中看到它:https ://code.woboq.org/llvm/libcxx/include/string.html

以某种方式阻止了相同的包含源代码最终出现两次,同时仍然允许单独编译每个文件。现在 Visual Studio 和 Projecet 文件以某种方式摆脱了手动执行此操作的需要。您没有与他们合作,因此您必须手动进行。

至于如何?我不知道为什么。正如我所说,我只是在我以前的 Native C++ 时代才知道这一点。近二十年来,我没有与没有 GUI 的编译器交谈过。


推荐阅读