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

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

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

创建两个不同的程序集

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

dotnet new classlib -o ClassLibrary1 -n ClassLibrary1
dotnet new classlib -o ClassLibrary2 -n ClassLibrary2

修改他们的 RootNamespace 为 Example:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <RootNamespace>Example</RootNamespace>
  </PropertyGroup>
</Project>

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

namespace Example
{
    public static class LinqExtensions
    {
        public static void Where(IEnumerable<int> source)
        {
            // 在这里添加代码
            Console.WriteLine("ClassLibrary1.Class1.Where");
        }
    }
}

创建一个控制台应用

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

dotnet new console -o ConsoleAppShi -n ConsoleAppShi
dotnet add ConsoleAppShi reference ClassLibrary1
dotnet add ConsoleAppShi reference ClassLibrary2

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

using Example;
var list = new int[]{1,2,3};
LinqExtensions.Where(list);

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

Ambiguous reference: Example.LinqExtensions Example.LinqExtensions match

通过别名的方式来解决

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

<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 方法:

extern alias ClassLibrary1;
extern alias ClassLibrary2;
var list = new[] { 1, 2, 3 };
ClassLibrary1::Example.LinqExtensions.Where(list);
ClassLibrary2::Example.LinqExtensions.Where(list);

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

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 扩展中加入了同样的方法签名,然后你就会遇到这个问题。

总结

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

参考

感谢您的阅读,如果您觉得本文有用,快点击下方点赞按钮👍,让更多的人看到本文。

欢迎关注作者的微信公众号“newbe技术专栏”,获取更多技术内容。


  1. https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/extern-alias?WT.mc_id=DX-MVP-5003606↩
目录
相关文章
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
本文深度分析了Redis内存陡增100%的一些细节和解决方案。
729 1
Redis:内存陡增100%深度复盘
|
12月前
|
Web App开发 网络协议 Java
Windows 终端命令详解:PowerShell 初学者指南
Windows 终端是一个命令行工具,允许用户通过文本命令与系统交互,执行文件管理、系统配置和网络诊断等操作。PowerShell 是 Windows 终端的现代版本,相比传统的命令提示符(CMD),它功能更强大,支持脚本编写和复杂任务处理。本文将以 PowerShell 为主,带你从零开始学习。
1505 6
|
前端开发 JavaScript Cloud Native
技术栈全景:如何为你的项目选择正确的心脏与骨骼
技术栈全景:如何为你的项目选择正确的心脏与骨骼
1297 113
|
开发者 UED 容器
07.精通HarmonyOS Flex对齐:从基础到高级布局技巧(上)
在HarmonyOS Next的ArkUI框架中,Flex容器提供了强大而灵活的对齐系统,使开发者能够精确控制子元素在容器中的排列方式。掌握这些对齐技术,是构建专业级用户界面的关键。
515 0
|
消息中间件 人工智能 Apache
Apache RocketMQ × AI:面向 Multi-Agent 的事件驱动架构
本文介绍基于Apache RocketMQ构建异步化Multi-Agent系统的新架构,通过语义化Topic实现Agent能力发现,利用Lite-Topic支持轻量级异步通信与结果反馈,结合InterestSet+ReadySet事件驱动模型,高效支撑任务闭环、状态恢复与动态编排,为Agentic AI提供高扩展、低延迟的协同机制。
|
运维 Serverless 调度
破解 vLLM + DeepSeek 规模化部署的“不可能三角”
vLLM 是一种便捷的大型语言模型(LLM)推理服务,旨在简化个人和企业用户对复杂模型的使用。通过 vLLM,用户可以轻松发起推理请求,享受高效、稳定的 LLM 服务。针对大规模部署 vLLM 的挑战,如大模型参数量、高效推理能力和上下文理解等,阿里云函数计算(FC)提供了 GPU 预留实例闲置计费功能,优化了性能、成本和稳定性之间的平衡。此外,FC 支持简便的部署流程和多种应用集成方式,帮助企业快速上线并管理 vLLM 服务。总结来说,vLLM 结合 FC 的解决方案为企业提供了强大的技术支持和灵活的部署选项,满足不同业务需求。
1238 94
破解 vLLM + DeepSeek 规模化部署的“不可能三角”
|
人工智能 自然语言处理 安全
国内版“Manus”Aipy,轻松get IDA PRO平替神器,简单又高效!
IDA Pro是一款专业逆向分析工具,支持多架构反汇编/反编译(含Hex-Rays伪代码转换)、静态分析(调用图/控制流图)、动态调试和插件扩展,尤其擅长恶意代码分析。针对新手用户,可使用AI辅助工具(如Aipy)实现轻量化自动分析,替代IDA完成基础反编译任务。示例任务成功反编译a.exe并生成分析报告,验证了简化流程的可行性。
|
数据采集 中间件 Python
Scrapy爬虫框架-通过Cookies模拟自动登录
Scrapy爬虫框架-通过Cookies模拟自动登录
690 0
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
2756 0