Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不同程序集,名称空间类名和方法签名都一样的方法,如何调用

不同程序集,名称空间类名和方法签名都一样的方法,如何调用

作者头像
newbe36524
发布于 2023-08-23 08:21:43
发布于 2023-08-23 08:21:43
28000
代码可运行
举报
运行总次数:0
代码可运行

有时候,你可能会遇到这样的问题,不同程序集,名称空间类名和方法签名都一样的方法,如何调用。本文将介绍如何通过别名的方式来解决这个问题。

创建两个不同的程序集

我们来创建两个不同的程序集,但是他们的名称空间一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet new classlib -o ClassLibrary1 -n ClassLibrary1
dotnet new classlib -o ClassLibrary2 -n ClassLibrary2

修改他们的 RootNamespace 为 Example:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <RootNamespace>Example</RootNamespace>
  </PropertyGroup>

</Project>

然后,我们在两个程序集中都创建一个类,类名也一样,并且添加一个自定义 Where 扩展方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace Example
{
    public static class LinqExtensions
    {
        public static void Where(IEnumerable<int> source)
        {
            // 在这里添加代码
            Console.WriteLine("ClassLibrary1.Class1.Where");
        }
    }
}

创建一个控制台应用

然后,我们创建一个控制台应用,来调用这两个程序集中的 Where 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet new console -o ConsoleAppShi -n ConsoleAppShi
dotnet add ConsoleAppShi reference ClassLibrary1
dotnet add ConsoleAppShi reference ClassLibrary2

然后,我们在控制台应用中调用这两个程序集中的 Where 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Example;
var list = new int[]{1,2,3};
LinqExtensions.Where(list);

如果是这样的话,我们会得到这个错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ambiguous reference: Example.LinqExtensions Example.LinqExtensions match

通过别名的方式来解决

我们可以通过别名的方式来解决这个问题,首先修改项目文件,设置两个程序集的别名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
      <Aliases>ClassLibrary1</Aliases>
    </ProjectReference>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj">
      <Aliases>ClassLibrary2</Aliases>
    </ProjectReference>
  </ItemGroup>
</Project>

然后,我们在控制台应用中调用这两个程序集中的 Where 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern alias ClassLibrary1;
extern alias ClassLibrary2;

var list = new[] { 1, 2, 3 };

ClassLibrary1::Example.LinqExtensions.Where(list);
ClassLibrary2::Example.LinqExtensions.Where(list);

运行就会得到这样的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ClassLibrary1.Class1.Where
ClassLibrary2.Class1.Where

为什么会有这种问题

一般来说你会在三种情况下遇到这个问题:

  1. 某个开源项目使用 ILmerge 把多个程序集合并成一个程序集。其中一个依赖项 A 恰好也是你的依赖项,但是 A 的版本和开源项目的依赖项 A 的版本不一样,这时候你就会遇到这个问题。
  2. 很早之前 Rx.net 正对 System.Linq.Async 进行了支持,而后来系统也内置了 System.Linq.Async。你会在使用 Rx.net 的时候遇到这个问题。
  3. 你的同事想考验你一下,估计把自己写的 Sqlite 扩展和 MSSQL 扩展中加入了同样的方法签名,然后你就会遇到这个问题。

总结

通过别名的方式,我们可以解决不同程序集,名称空间类名和方法签名都一样的方法,如何调用的问题。

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ABP微服务系列学习-搭建自己的微服务结构(一)
在原本的结构里面,由于默认服务引用的都是ABP原生的模块,所以结构目录里面没有包含modules目录,这里我们添加一个modules目录,用于存放我们的自定义模块。 在shared里面,我们再抽一个EventData的模块,用于消息队列共用数据实体。修改后结构如下图所示:
饭勺oO
2023/10/18
9150
ABP微服务系列学习-搭建自己的微服务结构(一)
dotnet 融合 Avalonia 和 UNO 框架
现在在 .NET 系列里面,势头比较猛的 UI 框架中,就包括了 Avalonia 和 UNO 框架。本文将告诉大家如何尝试在一个解决方案里面融合 Avalonia 和 UNO 两个框架,即在一个进程里面跑起来两个框架
林德熙
2024/06/23
4831
dotnet 融合 Avalonia 和 UNO 框架
ABP微服务系列学习-搭建自己的微服务结构(二)
在解决方案根目录添加common.props,这个文件的作用是可以配置项目文件全局的一些属性,如忽略警告,全局PackageReference,语言版本等。
饭勺oO
2023/10/18
6660
ABP微服务系列学习-搭建自己的微服务结构(二)
IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集之间的 InternalsVisibleTo 关系
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何判断两个程序集之间是否存在 InternalsVisibleTo 关系
林德熙
2023/06/23
3060
IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集之间的 InternalsVisibleTo 关系
.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
我们有多种工具可以将程序集合并成为一个。比如 ILMerge、Mono.Merge。前者不可定制、运行缓慢、消耗资源(不过好消息是现在开源了);后者已被弃用、不受支持且基于旧版本的 Mono.Cecil。
walterlv
2023/10/22
2.3K0
.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
学习Source Generators之HelloWorld
结合使用这两项操作能充分发挥源生成器的强大功能。 可以使用编译器在编译时构建的丰富元数据检查用户代码。 然后,生成器将 C# 代码发送回基于已分析数据的同一编译。 如果你熟悉 Roslyn 分析器,可以将源生成器视为可发出 C# 源代码的分析器。 源生成器作为编译阶段运行,如下所示:
饭勺oO
2024/03/29
2440
学习Source Generators之HelloWorld
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
2018-06-20 01:22
walterlv
2018/09/18
1.1K0
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
我们有多种工具可以将程序集合并成为一个。打包成一个程序集可以避免分发程序的时候带上一堆依赖而出问题。
walterlv
2023/10/22
3.3K0
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
.net Core 1.0.1 下的Web框架的的搭建过程step by step
环境:ubuntu+VScode 数据库:mysql ,ORM框架:chloe 官网
FreeTimeWorker
2020/08/31
4900
.net Core 1.0.1 下的Web框架的的搭建过程step by step
基于.net core实现项目自动编译、并生成nuget包
      近期想对自己的项目增加自动编译并生成nuget包,网上资料不少。但总还有迷糊的时候。首先:此解决方案包含多种版本的项目,如:有编译必须是x86平台,以及还有传统的.net foramework项目,以及多版本的.net core项目等。找到通用的解决方案还是用了不少的时间。本文章就对此做下自我总结。望对同仁有所帮助。 一、遇到的问题,以及解决办法 1.1 不同平台的编译怎么办       .net可以将dll(或者说是项目)编译成x86、x64、anycpu 等至少三种平台代码。但如果用dotn
sam dragon
2018/05/28
1.6K0
三种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用
当 A 项目引用 B 项目,那么使用 Visual Studio 或者 MSBuild 编译 A 项目之前就会确保 B 项目已经编译完毕。通常我们指定这种引用是因为 A 项目确实在运行期间需要 B 项目生成的程序集。
walterlv
2023/10/22
7780
三种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用
SourceYard 制作源代码包 控制台项目WPF 程序调试
本文带大家走进SourceYard开发之旅 在项目开发中,将一个大的项目拆为多个小项目解耦,减少模块之间的耦合。因为如果将代码放在一起,即使有团队的约束,但只要能写出的代码就会有小伙伴写出,很快就发现各个模块耦合的代码很多。但是对一个项目的拆分会让拆分出来的每一个项目都编译出一个 dll 增加运行文件的启动时间。 在开发中,常常会用到很多工具类,这些小轮子很多的功能基本就只有一个类,如何对这些小轮子进行管理?通过复制代码还是通过 Nuget 管理?
林德熙
2019/03/13
1.1K0
SourceYard 制作源代码包
            控制台项目WPF 程序调试
Fiddler 插件开发 将插件放在独立子文件夹防止 DLL 冲突
我的 Fiddler 安装了许多插件,有一些插件存在 DLL 名冲突问题,比如多个不同的插件都存在名为 PluginCore.dll 但实际实现逻辑完全不相同的程序集。这就导致了多个插件的安装之间,如果没有将其放入到单独的文件夹内,将会因为文件名相同而冲突,让插件不能同时都安装。本文将和大家介绍 Fiddler 官方提供的将插件放在独立子文件夹的方法,用来解决 DLL 命名冲突
林德熙
2023/11/28
2970
为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试
本文属于 IIncrementalGenerator 增量 Source Generator 源代码生成入门系列博客,本文将和大家介绍如何为源代码生成项目添加单元测试
林德熙
2024/02/07
1960
手把手教你写dotnet core(入门篇)
dotnet core最低开发环境要求就是一个.NET SDK,在这里可以下载的到最新版本的SDK,各个平台都有.
李国宝
2020/01/02
2.1K0
手把手教你写dotnet core(入门篇)
.net core 插件式开发
思考一种情况,短信发送,默认实现中只写了一种实现,因为某些原因该模块的所依赖的第三方无法继续提供服务,或者对于winform程序,某按钮单击,需要在运行时增加额外的操作,或者替换目前使用的功能,对于类似这样的需求,可以考虑使用插件式的方式搭建框架,以实现更灵活的可拆卸动态增加功能。 .net core 中提供了一种热加载外部dll的方式,可以满足该类型的需求 AssemblyLoadContext
FreeTimeWorker
2020/12/11
1.3K0
.net core 插件式开发
C# 程序集数量对软件启动性能的影响
本文通过很多的数据测试分析在一个项目引用很多个外部项目和将外部项目的类合并到一个项目之间的启动性能的不同。 通过分析知道了如果一个项目引用了很多项目,而且在启动过程会全部调用这些项目,这时的软件性能会比将这些项目的代码合并到一个项目的慢很多 本文的数据为 预编译框架,开发高性能应用 - 课程 - 微软技术暨生态大会 2018 - walterlv 提供
林德熙
2019/03/13
6770
C# 程序集数量对软件启动性能的影响
解决.NET Core/Standard 2.0编译时报“CS0579: Duplicate 'Assem
当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件。
Vaccae
2019/07/25
3.2K0
解决.NET Core/Standard 2.0编译时报“CS0579: Duplicate 'Assem
WPF 项目文件不加 -windows 的引用 WPF 框架方式
默认情况下的 WPF 项目都是带 -windows 的 TargetFramework 方式,但有一些项目是不期望加上 -windows 做平台限制的,本文将介绍如何实现不添加 -windows 而引用 WPF 框架
林德熙
2023/07/24
3870
从以前的项目格式迁移到 VS2017 新项目格式 必须删除必须修改添加文件项目引用引用包删除多余文件输入注释多个框架使用条件判断迁移 WPF 项目
以前的项目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的项目文件,后来还是决定不使用这个格式。 VS2017 的项目格式更好读、更简单而且减少了 git 冲突。 本文来告诉大家如何从 VS2015 和以前的项目格式修改为 VS2017 项目格式。
林德熙
2018/09/18
3.9K0
推荐阅读
ABP微服务系列学习-搭建自己的微服务结构(一)
9150
dotnet 融合 Avalonia 和 UNO 框架
4831
ABP微服务系列学习-搭建自己的微服务结构(二)
6660
IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集之间的 InternalsVisibleTo 关系
3060
.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
2.3K0
学习Source Generators之HelloWorld
2440
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
1.1K0
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
3.3K0
.net Core 1.0.1 下的Web框架的的搭建过程step by step
4900
基于.net core实现项目自动编译、并生成nuget包
1.6K0
三种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用
7780
SourceYard 制作源代码包 控制台项目WPF 程序调试
1.1K0
Fiddler 插件开发 将插件放在独立子文件夹防止 DLL 冲突
2970
为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试
1960
手把手教你写dotnet core(入门篇)
2.1K0
.net core 插件式开发
1.3K0
C# 程序集数量对软件启动性能的影响
6770
解决.NET Core/Standard 2.0编译时报“CS0579: Duplicate 'Assem
3.2K0
WPF 项目文件不加 -windows 的引用 WPF 框架方式
3870
从以前的项目格式迁移到 VS2017 新项目格式 必须删除必须修改添加文件项目引用引用包删除多余文件输入注释多个框架使用条件判断迁移 WPF 项目
3.9K0
相关推荐
ABP微服务系列学习-搭建自己的微服务结构(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验