2010-10-25 2 views
1

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

Мои 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 */) { /* ... */ } 
    } 
} 

Там не так много еще, только несколько констант и делегаты определены внутри класса, а также за пределами класса в пространстве имен. Любые мысли или предложения будут высоко оценены. Благодарю.

+0

возможно дубликат [Как экспортировать гр методы #?] (Http://stackoverflow.com/questions/2082159/how-to-export-c-methods) –

+0

Из-за сложности, я решил написать собственные DLL на C++. –

ответ

0
2

Dependency Walker для win32 библиотек DLL (который нативный код), а не сборки .NET (который управляемый код). Он не найдет методы в произвольном классе (даже если они статичны). Если вам нужно вызвать управляемый код из собственного кода, есть способы сделать это, but it's not pretty.

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

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

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

Это немного над моей головой в данный момент. Пример будет очень полезен. Благодарю. –

+0

Там вы идете :) –

+0

Из-за сложности я решил написать свои DLL на C++. –

0

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

Я смущен этой линии в вашем вопросе

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

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

0

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

0

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

Смежные вопросы