You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C#自定义DLL添加到dotnet框架实现无需引用直接调用

关于C#自定义DLL无需显式项目引用即可调用的问题解答

原生.NET运行时不支持类似Linux C++共享库的隐式加载调用逻辑,你描述的「仅写using语句无需添加项目引用即可调用DLL」的需求无法直接实现,核心原因是.NET的编译机制要求:编译阶段编译器必须获取到对应类型的定义元数据,未添加DLL引用的情况下,编译器无法识别对应命名空间下的类型,直接编写using语句会直接触发编译错误,无法进入运行时环节。

如果要实现类似共享库的动态调用效果,可以参考以下替代方案:

替代实现方案

1. 全局程序集缓存(GAC)部署(仅适用于.NET Framework)

  • 将强签名后的自定义DLL部署到系统GAC中后,仅需要在项目文件中声明对应程序集的名称引用即可直接调用,无需在项目目录存放DLL文件,也不需要手动指定DLL本地路径。不过该方案仍需要在项目层面声明程序集引用,并非完全不需要添加引用,仅省略了DLL文件的本地管理步骤。

注意:.NET Core/.NET 5+ 已正式弃用GAC机制,该方案仅支持.NET Framework环境。

2. 运行时动态加载+反射调用

  • 该模式和Linux下C++的dlopen/dlsym调用逻辑完全对等,完全不需要在编译阶段添加DLL引用,在代码运行时手动加载DLL后通过反射调用内部类型与方法,示例代码如下:
// 加载目标自定义DLL
var customAssembly = System.Reflection.Assembly.LoadFrom("自定义DLL的本地路径.dll");
// 获取要调用的类型,需传入完整的「命名空间.类名」
var targetType = customAssembly.GetType("CustomNamespace.TargetClass");
// 创建类型实例
var instance = Activator.CreateInstance(targetType);
// 调用目标方法
var methodResult = targetType.GetMethod("TargetMethod")?.Invoke(instance, new object[] { "参数1", 123 });
  • 该方案的缺陷是无法直接使用using声明命名空间,也没有编译时类型检查,类型名、方法名、参数写错的问题只会在运行时才会暴露。

3. 全局隐式引用配置(适用于.NET Core/.NET 5+)

  • 如果你使用的是SDK风格的.NET项目,可以在项目根目录添加Directory.Build.props配置文件,全局统一配置自定义DLL的引用规则,该目录下的所有项目会自动继承这个引用配置,不需要在Visual Studio中单独给每个项目手动添加引用,即可直接using对应命名空间调用。本质上仍是提前配置了引用,仅省略了手动操作的步骤,示例配置如下:
<Project>
  <ItemGroup>
    <Reference Include="CustomDllName">
      <HintPath>C:\GlobalDllStore\CustomDllName.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

内容的提问来源于stack exchange,提问作者Mehrdad Akbari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:18:03