【问题标题】:Use existing source code in another project/namespace在另一个项目/命名空间中使用现有源代码
【发布时间】:2016-03-28 01:26:03
【问题描述】:

我在一个解决方案中有两个库项目(除了其他项目),它们必然需要共享某些类,但出于自动更新的原因必须保持独立。

对于共享的类,理想情况下,我希望在两个库中使用相同的class.cs 文件,这样我就不必始终检查对类的更改是否通过两个库传播。

但是两个库的命名空间不同,因此每个库中的类包含文件需要不同的namespace classlib {} 声明。

如果有技术通过分支/合并操作来做到这一点,我正在使用 git repo。
目前使用VS2013。

我怎样才能做到这一点?


例子:

library1.dll

namespace library1
{
    public class SharedClass
    {
        /// code must match SharedClass in libary2
    }
}

library2.dll

namespace libary2
{
    public class SharedClass
    {
        /// code must match SharedClass in library1
    }
}

【问题讨论】:

  • 不清楚你在问什么
  • 为什么同一个类属于两个不同的命名空间?
  • @HamletHakobyan 因为我需要在同一个解决方案中的两个不同库中存在同一个类。我需要能够单独更新 library.dll 文件。
  • 为什么不创建一个两个 DLL 都可以引用的新 DLL?对我来说听起来像是一个设计问题。我从来没有遇到过我真的需要复制代码的情况
  • 我尽量确保每个库都可以包含多个命名空间。

标签: c# git visual-studio visual-studio-2013 repository


【解决方案1】:

在公共命名空间中声明 SharedClass,而不是在两个不同的命名空间中。您可以将文件链接到项目中,而不是物理地包含它。

来自msdn

您从 Visual Studio 中的项目链接到一个文件。在解决方案资源管理器中,右键单击您的项目,然后选择添加现有项目,或者,您可以键入 Shift+Alt+A。在“添加现有项”对话框中,选择要添加的文件,在“添加”下拉列表中单击“添加为链接”。

namespace Khargoosh.MathLib.Common   { public class SharedClass { ... }  }
namespace Khargoosh.MathLib.Library1 { ... }
namespace Khargoosh.MathLib.Library2 { ... }

namespace Khargoosh.MathLib          { public class SharedClass { ... }  }
namespace Khargoosh.MathLib.Library1 { ... }
namespace Khargoosh.MathLib.Library2 { ... }

另一种处理方式是使用T4 template 和一些逻辑来动态创建文件。 *.tt 模板文件的内容(不是 *.cs 文件!):

namespace library1
{
<#@ include file="MyCommonClass.cs"#>
}

在另一个库中

namespace library2
{
<#@ include file="MyCommonClass.cs"#>
}

类文件本身不会声明命名空间。

【讨论】:

  • 是的 - 这正是我正在寻找的东西。
  • 我在使用您的第二个解决方案时不断遇到错误preprocessor directives must appear as the first non-whitespace character on a line
  • 对于T4 template 解决方案,您不会创建 ,cs 文件,而是创建 *.tt 文件。这个 *.tt 文件(模板)然后会自动生成一个 *.cs 文件。 Oleg Sych 的 Visual Studio 扩展 *T4 Toolbox for Visual Studio 在使用 T4 模板时非常有用。
【解决方案2】:

根据您提供的信息,如果您的共享类真正“通用”,您应该创建一个您的两个主库都可以引用的第三个库。例如:

主库1 (参考 commonLib

主库2 (参考 commonLib

commonLib (包括class.cs等常用代码)

【讨论】:

  • 这些类是真正通用的,但文件不能相互依赖或依赖于第三个库。使用库 A 的项目必须能够删除/更新库 B,反之亦然。
  • MainLib1.dll 和 MainLib2.dll 都不需要 commonLib.dll 存在吗?如果是这样,我将无法更新 commonLib.dll,因为在更新 commonLib.dll 期间需要 commonLib.dll 中存在的类。
  • 一个“commonLib”库将允许库 A 删除/更新库 B。
  • 回答你的另一个问题,你到底想做什么?您希望 commonLib 能够自我更新吗?
  • 嗯,是的,如果我使用这种方法,我希望 commonLib 能够自我更新。但是执行更新的应用程序需要 commonLib 中的类在更新期间可用。
【解决方案3】:

我需要能够单独更新library.dll 文件

那么你应该为这个任务使用子模块。

子模块是同一根目录下的不同 git 存储库。
这样,您可以在根存储库内的文件夹级别管理 2 个不同的项目

【讨论】:

  • 感谢@codeWizard。这听起来是个不错的方法。我会对此进行更多研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多