我在我的软件中动态编译最终用户编写的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 :我只需要成功编译代码,我就不想运行它。
答案 0 :(得分:0)
我认为A.dll
和B.dll
是您的程序集吗?
如果是这样,一种方法是只公开这些库的接口(即将接口和实现放在单独的程序集中),然后运送接口程序集。
这样,就没有什么可以反编译/反向工程,它会让编译器感到高兴。
要轻松生成所述程序集,您可以使用Roslyn:删除任何私有(字段,属性,方法等)或不必要的(静态构造函数,内联初始化程序等),使用throw new替换公共类的公共方法体例如NotImplementedException()并仅编译它。
这将生成仅仅是shell的程序集,但是有效地暴露了对编译器来说足够的正确接口。