如何将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
相关产品推荐
相关产品推荐

