简体   繁体   中英

C# add a reference using only code (no IDE “Add Reference” functions)

I am writting a plugin for a program, and I want to put my code inside a DLL so I can share the plugin freely without exposing (giving away) my code.

Here is the basic structure i have access to :

using System;
public class Plugin
{
    public void Initialize()
    {
        //do stuff here
        doWork();
    }
}

Then i just reference the .cs file my code is at and the program "eats" up this Plugin. Now, i have put several logic in there, consisting mostly of functions that arent tied directly to "Initialize()", only on the doWork() function, that starts the whole system.

Now, I want to put all my code inside a DLL, and then just call from inside Initialize(), myDll.doWork() (or something like that).

PS: This dll would ofc be a compiled C# library (could it be called dynamic assembly import? it wouldnt really be dynamic since it would be compiled pre-execution anyways, right?)

PS2: This way I can also add custom resources like forms, images and such without much difficulty right?

PS3: Is there a free tool for protecting the code inside such DLL? (ie protect from beeing easily re engineered)

Thanks in advance =)

Found exactly what I was looking for, here it is:

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);            
}

The best option would be to use a framework for creating extensible applications:

If you want to do it manually, you can use the Assembly.Load*() methods to load an assembly at runtime. You can search the assembly for types that implement a specific interface and then create instances using Activator.CreateInstance . The assemblies can be compiled separately, you just have to reference an assembly that contains the interface shared by application and plugin.

For obfuscation, there are a couple of obfuscation tools available.

使用静态Assembly.Load()/ Assembly.LoadFile()/ Assembly.LoadFrom()方法来动态加载程序集。

FYI, remember to use a tool like Red-Gate's .Net Reflector to inspect your DLL to make sure it is properly obfuscated. This free, visual tool lets you see the DLL as your users will see it so you'll know if your code is exposed

alt text http://img149.imageshack.us/img149/2025/screenshotfullscreen.gif

.Net comes with Dotfuscator Community Edition which can be used to obfuscate your code. No coding is required, see their user guide to learn your way around the GUI if you need help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM