我正在为一个程序编写一个插件,我想将我的代码放在一个DLL中,这样我就可以自由地共享该插件而不会暴露(赠送)我的代码。
以下是我可以访问的基本结构:
using System;
public class Plugin
{
public void Initialize()
{
//do stuff here
doWork();
}
}
然后我只引用我的代码所在的.cs文件,程序“吃掉”这个插件。现在,我已经在其中放置了几个逻辑,主要包括不直接与“Initialize()”相关联的函数,仅在启动整个系统的doWork()函数上。
现在,我想将所有代码放在DLL中,然后从Initialize(),myDll.doWork()(或类似内容)中调用。
PS:这个dll将是一个已编译的C#库(它可以被称为动态程序集导入吗?它不会真正动态,因为它会在执行前编译,对吧?)PS2:这样我还可以毫不费力地添加表格,图片等自定义资源吗?
PS3:有没有一个免费的工具来保护这些DLL中的代码? (即防止轻易重新设计)
提前致谢=)
答案 0 :(得分:7)
找到我正在寻找的东西,这里是:
using System.Reflection;
using System.IO;
try
{
Assembly a = null;
a = Assembly.LoadFrom(Application.StartupPath startupPath + "MyAssembly.dll");
Type classType = a.GetType("MyNamespace.MyClass");
object obj = Activator.CreateInstance(classType);
MethodInfo mi = classType.GetMethod("MyMethod");
mi.Invoke(obj, null);
}
catch (Exception e)
{
AddLog(e.Message);
}
答案 1 :(得分:3)
最好的选择是使用框架来创建可扩展的应用程序:
如果要手动执行此操作,可以使用Assembly.Load*()方法在运行时加载程序集。您可以在程序集中搜索实现特定接口的类型,然后使用Activator.CreateInstance创建实例。程序集可以单独编译,您只需要引用包含应用程序和插件共享的接口的程序集。
对于混淆,a couple obfuscation tools可用。
答案 2 :(得分:1)
使用静态Assembly.Load()/ Assembly.LoadFile()/ Assembly.LoadFrom()方法动态加载程序集。
答案 3 :(得分:0)
仅供参考,请记得使用像Red-Gate's .Net Reflector这样的工具来检查您的DLL,以确保它被正确混淆。这个免费的可视化工具让您可以看到DLL,因为您的用户将看到它,因此您将知道您的代码是否暴露
alt text http://img149.imageshack.us/img149/2025/screenshotfullscreen.gif
.Net附带Dotfuscator Community Edition,可用于混淆代码。无需编码,如果需要帮助,请参阅他们的user guide以了解GUI。