如何开发可调用但不公开源码的C# API/类库以保护自研算法
C# 封装自研算法API方案解答
1. Class Library是否可以实现需求
完全可以。C#类库项目编译后生成的是.dll程序集,你仅需要对外发布编译后的.dll文件(可选附带.xml注释文档方便调用方查看参数说明)即可,不会泄露源码,完全满足你保护自研算法的要求。
2. 实现目标调用形式的开发步骤
你需要的using引入后直接调用方法的效果,可以通过静态类+静态方法配合C#的using static指令实现,具体步骤如下:
- 新建C#类库项目,可根据目标调用方的运行环境选择.NET Framework/.NET Core/.NET 5+版本
- 在类库中定义你指定的命名空间,比如
ApiName,在命名空间下定义公开静态类,将所有对外暴露的算法方法声明为公开静态方法,示例代码如下:
namespace ApiName { public static class AlgorithmApi { // 你封装的自研算法方法 public static void Calculate(float x, float y) { // 内部实现你的算法逻辑,编译后不会对外暴露 } // 其余对外方法按同样规则定义即可 } }
- 编译类库项目,从输出目录拿到
ApiName.dll文件,这就是你可以对外发布的API文件,不要外传项目内的.cs源码文件即可。
3. 调用方使用方式
调用方在自己的C#项目中引用你提供的ApiName.dll后,按如下方式引入即可实现你要求的调用效果,和Windows API调用形式完全一致:
// 直接引入静态类,无需额外实例化 using static ApiName.AlgorithmApi; namespace CallerDemo { class Program { static void Main(string[] args) { // 直接传参调用方法,无需加类名前缀 Calculate(100, 200); } } }
如果调用方用普通的using ApiName;引入,仅需要加类名前缀调用即可:AlgorithmApi.Calculate(100,200),你可以在发布说明里告知调用方用using static的方式即可实现无前缀调用。
4. 额外源码保护建议
C#编译生成的.dll默认可以被反编译为可读性很高的C#代码,建议你编译后对.dll做混淆处理:可以用免费的ConfuserEx、或者商业的Dotfuscator等混淆工具处理,混淆后即使.dll被反编译,也只能拿到逻辑混乱、可读性极差的代码,无法还原你的原始算法实现,进一步加强源码保护。
内容的提问来源于stack exchange,提问作者Falconeer
相关产品推荐
相关产品推荐

