我正在尝试编译一个。Net c#项目到多个dll中。但事情是这样的。
这是我的项目结构。
Bin
Dir1
Dir2
File1.cs
File2.cs
myproject.csproj
我想将此项目编译为File1.dll和File2.dll。File1.dll与File2.dll都使用Dir1和Dir2中的各种.cs文件中的代码。子目录中的.cs文件中的某些类是File1.cs所需的,而另一些则是File2.cs所需。File1.cs和File2.cs都会使用一些类。
我使用了以下内容:
csc /t:library /out:File1.dll /recurse:*.cs
csc /t:library /out:File2.dll /recurse:*.cs
但是生成的dll是彼此的精确副本,只是文件名不同。有没有一种方法可以编译它们,这样当我在对象浏览器中检查每个dll时,它只有Dir1和Dir2中的.cs文件中的那些类,这些类在File1.dll的File1.cs中引用,在File2.dll中也引用?
我想最好将此作为Visual studio中后期构建步骤的一部分。
谢谢你抽出时间。。。
编辑
感谢您的回复。有许多建议将解决方案分解为许多项目。虽然这是一种方法,但我不确定我是否想要为两个dll(即File1.dll和File2.dll)创建任何依赖项。让我解释一下。。
我看到创建多个项目的问题是,File1.cs和File2.cs都需要一些代码。我不希望它们在两个项目中重复出现。在第三个项目中保留公共代码意味着将创建File1.dll和File2.dll都需要的第三个dll。我不想要这样。我只想创建File1.dll和File2.dll,这就是为什么我把它们都放在一个项目中。关于如何实现这一点,有什么建议吗?
再次感谢您的回复。
欢呼。
如果您希望每个组件都有单独的库,则需要将项目拆分为同一解决方案中的多个项目。
您可以将同一个文件包含在多个项目中,而无需创建重复副本(Add as link
),以避免出现重复代码的问题。
您可以使用条件编译符号(#if DLL1
、#if DLL2
)。
然后,在构建步骤中,使用/p:DefineConstants
选项调用msbuild来设置这些符号。
MSBUILD /p:DefineConstants=DLL1 ...
基本上是使用不同的条件编译符号集对项目进行两次编译。
为要生成的每个DLL创建一个项目,并为每个DLL添加特定的文件。例如,包含File1.cs
的myproject1.csproj
(以及根据需要的其他文件)和包含File2.cs
的myproject2.csproj
。之后,创建第三个项目,该项目包含任何公共文件,并引用前两个项目中的共享程序集。
或者,如果要包含和排除不同的代码段,请考虑#if语句检查预处理器常量。
您需要多个项目才能做到这一点。没有什么可以阻止你从多个项目中引用同一个CS文件。
此外,如果这样做是有意义的,那么如果您需要逻辑分组,两个项目都可以存在于一个解决方案下。