无需使用原始所需程序集即可动态编译C#代码

时间:2014-09-06 11:33:37

标签: c# compilation .net-assembly

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

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

因此我应该用我的软件发布这些程序集(" A.dll"和#34; B.dll")但是由于安全原因,我不想要用户可以通过逆向工程访问这些组件的来源。

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

注意2 :我知道混淆,但我不想使用它。

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

1 个答案:

答案 0 :(得分:0)

我认为A.dllB.dll是您的程序集吗?

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

这样,就没有什么可以反编译/反向工程,它会让编译器感到高兴。

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

这将生成仅仅是shell的程序集,但是有效地暴露了对编译器来说足够的正确接口。