В C # DLL отсутствуют публичные функции - PullRequest
1 голос
/ 25 октября 2010

Я пытаюсь написать DLL с использованием C # .NET Framework 2.0. Все компилируется, но когда я пытаюсь получить доступ к DLL из моего приложения, происходит сбой при попытке получить адрес процедуры. Итак, я выбрал DLL в Dependency Walker, и все мои публичные функции отсутствуют!

Моя DLL на данный момент довольно проста:

namespace MyDll_Namespace
{
    public class MyDllClass
    {
        public static int Func1( /* params */ ) { /* ... */ }

        public static int Func2( /* params */ ) { /* ... */ }

        public static int Func3( /* params */ ) { /* ... */ }

        public static int Func4( /* params */ ) { /* ... */ }
    }
}

Больше ничего нет, только несколько констант и делегатов, определенных внутри класса, а также вне класса в пространстве имен. Любые мысли или предложения будут высоко оценены. Спасибо.

Ответы [ 5 ]

2 голосов
/ 25 октября 2010

Средство обхода зависимостей предназначено для DLL-библиотек win32 (то есть нативный код ), а не сборок .NET (то есть управляемый код ). Он не найдет методы в произвольном классе (даже если они статические). Если вам нужно вызвать управляемый код из нативного кода, есть способы сделать это, , но это не очень .

Если вы хотите использовать свою dll из управляемого кода, это намного проще. Проверьте System.Assembly и Активатор .

Пример этого:

var assembly = Assembly.LoadFile(@"\path\to\your.dll");
var mydllclass_type = assembly.GetType("MyDllClass");
var instance = Activator.CreateInstance(mydllclass_type);

Экземпляр будет объектом. Для вызова методов вам нужно использовать отражение, потому что интерфейс не известен во время компиляции.

Если вы создаете систему плагинов, лучше всего иметь общий интерфейс или абстрактную базу для всех плагинов и ссылаться на них в вашей программе. Те третьи лица, которые реализуют плагин, также будут ссылаться на этот договор. В этом случае последняя строка немного меняется:

var instance = (IMyDllClass)Activator.CreateInstance(mydllclass_type);

Теперь вы можете использовать методы, как в правильно построенном объекте.

0 голосов
/ 29 октября 2010

Я решил написать свои DLL на C ++. Однако вот несколько полезных сведений, которые я нашел для использования управляемого кода из неуправляемого кода:

0 голосов
/ 25 октября 2010

Вам нужно добавить ссылку на вашу dll, и среда выполнения автоматически позволит вам вызвать вашу функцию.Вот небольшой учебник по написанию библиотеки классов .net.

0 голосов
/ 25 октября 2010

Попробуйте .net Reflector, чтобы точно увидеть, что находится внутри вашей встроенной DLL (чтобы убедиться, что все так, как и должно быть).Также убедитесь, что вы находитесь в режиме релиза при сборке DLL, прежде чем ссылаться на нее ... Я не знаю, собирается ли она что-то изменить, но стоит попробовать =)

0 голосов
/ 25 октября 2010

Часть проблемы здесь заключается в том, что средство обхода зависимостей является инструментом для собственных приложений.Он не понимает управляемый код и, следовательно, не отображает ни один из определенных типов управляемых типов +.

Я запутался в этой строке в вашем вопросе

, когда я пытаюсь получить доступ к DLL из моего приложения, он не может получить адрес процедуры

Это немного похоже на ошибку, которую я вижу в нативном приложении, а не в управляемом.Вы пытаетесь получить доступ к коду C # из нативного приложения?Если это так, то это можно сделать только с помощью COM magic, а не с помощью прямого вызова.Можете ли вы объяснить более подробно, что здесь происходит?

...