C # добавить ссылку, используя только код (без IDE "Добавить ссылку" функции) - PullRequest
5 голосов
/ 12 сентября 2009

Я пишу плагин для программы, и я хочу поместить свой код в 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? (т. е. защита от повторного использования)

Заранее спасибо =)

Ответы [ 4 ]

7 голосов
/ 12 сентября 2009

Нашел именно то, что искал, вот оно:

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);            
}
3 голосов
/ 12 сентября 2009

Наилучшим вариантом будет использование инфраструктуры для создания расширяемых приложений:

Если вы хотите сделать это вручную, вы можете использовать методы Assembly.Load * () для загрузки сборки во время выполнения. Вы можете искать в сборке типы, которые реализуют определенный интерфейс, а затем создавать экземпляры, используя Activator.CreateInstance . Сборки могут быть скомпилированы отдельно, вам нужно просто сослаться на сборку, которая содержит интерфейс, общий для приложения и плагина.

Для обфускации доступно пара из инструментов для запутывания .

1 голос
/ 12 сентября 2009

Используйте статические методы Assembly.Load () / Assembly.LoadFile () / Assembly.LoadFrom () для динамической загрузки сборок.

0 голосов
/ 12 сентября 2009

К вашему сведению, не забудьте использовать такой инструмент, как .Net Reflector от Red-Gate , чтобы проверить вашу DLL, чтобы убедиться, что она правильно скрыта Этот бесплатный визуальный инструмент позволяет вам видеть DLL так, как ее видят ваши пользователи, чтобы вы знали, выставлен ли ваш код

альтернативный текст http://img149.imageshack.us/img149/2025/screenshotfullscreen.gif

.Net поставляется с Dotfuscator Community Edition , которую можно использовать для обфускации вашего кода. Кодирование не требуется, см. Их руководство пользователя , чтобы узнать, как работать с GUI, если вам нужна помощь.

...