如何在项目中使用两个含共享类的类库?解决重复定义报错
解决类型重复定义错误的方案
问题核心
共享项目的代码会被直接嵌入到引用它的类库中,因此Common.csproj和CustomControls.csproj编译后,各自都包含了myDataInfo.cs的完整实现。当Test.csproj同时引用这两个类库时,就会触发类型重复定义的冲突。
具体解决办法
1. 将共享项目转为类库项目
把SharedProject1从共享项目改为普通类库项目:
- 右键
SharedProject1→ 卸载项目 → 编辑.shproj文件,将项目类型修改为类库格式;或者直接新建类库项目,把myDataInfo.cs迁移过去。 - 让
Common和CustomControls都引用这个类库项目(而非共享项目),这样myDataInfo的实现仅存在于类库中,Test项目引用两个类库时不会出现冲突。
2. 通过命名空间隔离共享代码
若必须保留共享项目,给myDataInfo.cs添加命名空间隔离:
- 在
myDataInfo.cs中加入条件编译指令:#if COMMON_PROJECT namespace Common #elif CUSTOM_CONTROLS_PROJECT namespace CustomControls #endif public class myDataInfo { // 类逻辑代码 } - 分别给两个类库项目添加编译常量:
Common.csproj:在项目属性的「生成」选项卡中添加COMMON_PROJECT常量CustomControls.csproj:添加CUSTOM_CONTROLS_PROJECT常量
- 在
Test项目中使用时,通过对应命名空间引用:new Common.myDataInfo()或new CustomControls.myDataInfo()
3. 在Test项目中排除重复类型
如果只需要其中一个类库中的myDataInfo,可在Test.csproj中排除另一个类库的该类型:
- 编辑
Test.csproj,在对应类库的引用节点中添加排除规则:
注意:此方法要求两个类库中的<ItemGroup> <ProjectReference Include="..\CustomControls\CustomControls.csproj"> <ExcludeAssets>all</ExcludeAssets> <IncludeAssets>compile; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <Private>True</Private> <ExcludeTypes>CustomControls.myDataInfo</ExcludeTypes> </ProjectReference> </ItemGroup>myDataInfo功能完全一致,否则可能引发逻辑异常。
内容的提问来源于stack exchange,提问作者Chibako
相关产品推荐
相关产品推荐

