在另一个项目/命名空间中使用现有的源代码

5
我有一个解决方案中包含两个库项目(除其他项目外),这两个项目必须共享某些类,但为了自动更新的原因必须保持分离。
对于共享的类,我希望在两个库中使用相同的class.cs文件,以便不必一直检查类的更改是否传播到两个库中。
然而,两个库的命名空间不同,因此每个库中包含类的文件需要不同的namespace classlib {}声明。
我正在使用git存储库,如果有通过分支/合并操作完成此操作的技术。
目前使用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
    }
}

你的问题不太清楚,请说明具体要求。 - CodeWizard
为什么同一个类属于两个不同的命名空间? - Hamlet Hakobyan
因为我需要同一个类存在于同一个解决方案中的两个不同库中。我需要能够单独更新library.dll文件。@HamletHakobyan - khargoosh
1
我尽力确保您知道每个库可以包含多个命名空间。 - Hamlet Hakobyan
我理解库可以包含多个命名空间。但是命名空间声明是类名的一部分。同一个类如何存在于两个命名空间中? - khargoosh
显示剩余11条评论
3个回答

5
在公共命名空间中声明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模板,并使用一些逻辑来动态创建文件。*.tt模板文件的内容(而不是*.cs文件):

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

还有另外一个库

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

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


是的 - 这正是我在寻找的东西。 - khargoosh
我在使用你的第二个解决方案时一直遇到以下错误: “预处理器指令必须出现在行的第一个非空白字符位置。” - Chirag Acharya
对于T4模板解决方案,您不会创建一个*.cs文件,而是创建一个*.tt文件。这个*.tt文件(即模板)然后会自动生成一个*.cs文件。当使用T4模板时,来自Oleg Sych的Visual Studio扩展T4 Toolbox for Visual Studio非常有用。 - Olivier Jacot-Descombes

3
根据您提供的信息,如果您共享的类确实为“通用”,则应创建一个第三方库,这样您的两个主要库都可以引用它。例如:
MainLib1(引用commonLib
MainLib2(引用commonLib
commonLib(包括class.cs和其他通用代码)

类是真正通用的,但文件不能相互依赖,也不能依赖第三方库。使用 A 库的项目必须能够删除/更新 B 库,反之亦然。 - khargoosh
MainLib1.dll和MainLib2.dll都需要commonLib.dll存在吗?如果是这样,我将无法更新commonLib.dll,因为在更新commonLib.dll期间需要存在于commonLib.dll中的类。 - khargoosh
@khargoosh:共享程序集比共享源文件更为常见。如果commonLib发生变化但其接口保持不变且您没有对程序集进行签名,则可以更新它而无需更新其他两个库。 - Olivier Jacot-Descombes
谢谢Olivier。我知道这更常见。但是,我需要部署此产品,因为可能会有要求更改或添加接口。 - khargoosh
自我更新,是的。该产品由两个服务和一个WinForms应用程序组成。Library1被一个服务使用,而Library2被另一个服务和应用程序使用。 - khargoosh
显示剩余5条评论

3
我需要能够单独更新library.dll文件。 那么你应该使用子模块来完成这个任务。 子模块是在同一个根目录下的不同git存储库。 这样,您可以在根存储库内的文件夹级别上管理2个不同的项目。

enter image description here


谢谢@codeWizard。这听起来是一个不错的方法。我会对此进行更多的研究。 - khargoosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接