【问题标题】:Modifying how Visual Studio/Dot Net creates DLL's?修改 Visual Studio/Dot Net 如何创建 DLL?
【发布时间】:2019-01-18 00:51:24
【问题描述】:

我有一个问题,主要是出于好奇,但也是针对一个宠物项目:

给定一个简单的 C# 解决方案,我最终会在构建后得到一个 A.dll 和一个 B.dll:

Solution
  - Project A
    - Class A1
    - Class A2
  - Project B
    - Class B1
    - Class B2

我很好奇的是:有什么方法可以让 DotNet/Visual Studio/MS Build/whatever 以不同的方式生成 DLL?

朝着正确方向迈出的一步是从单个项目中生成多个 DLL,比如说 A.A1.dll 中只有 A1 类,而 A.A2.dll 中只有 A2 类?

一个更有趣的例子是生成带有 A1 和 B1 的 Lib1.dll 以及带有 A2 和 B2 的 Lib2.dll。

我确实意识到我在现实生活场景中所要求的复杂性远高于给出的简单描述。

我只是好奇这在理论上是否可行(无需数千小时的工作)。如果是这样,我可以尝试什么方法?

【问题讨论】:

  • 为什么要这样做?
  • 您当然可以创建一个额外的项目文件,使用链接分别包含文件 A1 和 B1。
  • 如果您尝试以这种方式拆分和加入类,请使用项目结构。否则,这听起来像是一个 XY 问题。您需要解释实际情况才能获得有意义的帮助。
  • 构建自己的构建目标相对简单,我认为当类是独立的时,你的要求(将每个文件编译成单独的 DLL)有点微不足道......现在达到“相对简单”状态需要擅长 MSBuild,这反过来意味着阅读和理解大量可用信息(即阅读几本书)。即使仅此一项对于 SO 来说也可能过于宽泛(现在不太可能完成)......如果您的类实际上相互依赖,那么自动计算依赖关系会更有趣(并且超出 SO 问题的范围)
  • 您仍然需要解释“我在现实生活场景中的要求”。由于项目是组织 C# 源文件并编译为程序集的最小单元,因此您上面描述的内容破坏了完整性,并且对我没有任何实际价值。

标签: c# .net visual-studio .net-core roslyn


【解决方案1】:

您可以直接使用 C# 编译器来制作 DLL 和 EXE 文件。编译器是 .NET Framework 安装的一部分,因此您不需要 Visual Studio 即可运行它。

Visual Studio 项目文件实际上只是一种组织源文件、依赖项和编译器设置的便捷方式。 Visual Studio 是这些项目文件之上的一个不错的 GUI。

使用以下文件:

C:.
│   build.bat
│   Program.cs
│
├───ProjectA
│       ClassA1.cs
│       ClassA2.cs
│
└───ProjectB
        ClassB1.cs
        ClassB2.cs

ClassA1.cs:

public class ClassA1
{
public static void SayHello()
{
System.Console.WriteLine("ClassA1 says Hello World!");
}
}

ClassA2.cs:

public class ClassA2
{
public static void SayHello()
{
System.Console.WriteLine("ClassA2 says Hello World!");
}
}

程序.cs:

class Program
{
static void Main()
{
System.Console.WriteLine("Program says Hello World!");

ClassA1.SayHello();
ClassA2.SayHello();
}
}

我们使用 C# 编译器 csc.exe 构建所有内容,使用批处理脚本 build.bat:

REM Building my project using the C# compiler
REM NOTE: Add the path to the compiler to the path variable:
REM       set path=%path;%windir%\Microsoft.NET\Framework\v4.0.30319

csc /out:A.A1.dll /target:library ProjectA\ClassA1.cs
csc /out:A.A2.dll /target:library ProjectA\ClassA2.cs

csc /out:Program.exe /r:A.A1.dll,A.A2.dll  Program.cs

这会生成两个 DLL(A.A1.dllA.A2.dll)和一个程序(Program.exe)使用如下所示的 DLL:

C:.
│   A.A1.dll
│   A.A2.dll
│   build.bat
│   Program.cs
│   Program.exe
│
├───ProjectA
│       ClassA1.cs
│       ClassA2.cs
│
└───ProjectB
        ClassB1.cs
        ClassB2.cs

运行程序给出以下输出:

C:\Temp\HelloWorld>Program.exe
Program says Hello World!
ClassA1 says Hello World!
ClassA2 says Hello World!

C:\Temp\HelloWorld>

【讨论】:

  • 完美!这就是我一直在寻找的:工作的起点:) 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多