在不使用原始必需程序集的情况下动态编译C#代码

本文关键字:情况下 动态 编译 代码 程序集 原始 | 更新日期: 2023-09-27 18:20:56

我正在软件中动态编译最终用户编写的C#代码。为了编译代码,我需要添加一些程序集作为对CompilerParameters的引用。

CompilerParameters loParameters = new CompilerParameters();
loParameters.ReferencedAssemblies.Add("C:'A.dll")
loParameters.ReferencedAssemblies.Add("C:'B.dll")

因此,我应该用我的软件发布这些程序集("A.dll"answers"B.dll"),但出于安全原因,我不希望用户可以通过反向工程访问这些程序集的源。

注意1:我可以删除所需程序集(A和B)中方法的实现,但我的程序集很大,我无法手动执行。

注意2:我知道模糊处理,但我不想使用它。

注意3:我只需要成功编译代码,我不想运行它。

在不使用原始必需程序集的情况下动态编译C#代码

我假设A.dllB.dll是属于您的程序集?

如果是这样的话,一种方法是只向这些库公开接口(即将接口和实现放在单独的程序集中),然后运送接口程序集。

这样,就不需要进行反编译/反向工程,编译器也会感到高兴。

为了容易地生成所述程序集,您可以使用Roslyn:删除任何私有的(字段、属性、方法等)或不必要的(静态构造函数、内联初始化程序等),例如,用throw-new NotImplementedException()替换公共类的公共方法体,然后只编译它。

这将产生仅仅是外壳的程序集,但有效地公开了正确的接口,这对于编译器来说是足够的。

相关文章: