c# - 尝试使用自定义类编译类会导致错误 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.cs
(csc /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();
}
}
}
解决方案
我希望我能给你一个更好的答案,但问题似乎归结为你编译不是一个项目,只是一堆松散的 .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 的编译器交谈过。
推荐阅读
- javascript - 单击外部表单时不要关闭模式
- bash - 如何在 ssh 上拖尾日志时在正则表达式匹配上本地播放音频
- javascript - Owl Carousel 2 - 获取活动物品
- angular - 根据显示的内容实现错误拦截器
- mysql - 使用外键从其他表中选择数据?
- ruby-on-rails - 使用 Rails 更新 Stripe 法人实体
- android - kivy android app:将api级别从19设置为26失败
- docker - Docker 上的 GitLab:如何在部署之间保留用户数据?
- azure-cognitive-search - 使用 Azure 搜索在特定字段中搜索特定值
- python-2.7 - Apache Beam - pip install '.[gcp,test]' - RuntimeError: Not in apache git tree; 找不到原型定义