2013-06-15 3 views
9

Я пытался использовать расширение «Неуправляемый экспорт» Роберта Гизеке в проекте Visual Studio 2010 pro/C#. Тем не менее, я не могу заставить его работать - когда я проверяю скомпилированную DLL для экспорта, просмотрщик (http://www.nirsoft.net/utils/dll_export_viewer.html) всегда выглядит пустым, экспорт не кажется вообще определенным.C# «Неуправляемый экспорт»

Я скопировал этот пример и установил команду build/config manager/active platform на x86. Могу ли я как-нибудь проверить, действительно ли запущена задача MSBuild, выполняющая всю магию, или нет? Что должен содержать файл проекта (он кажется мне подозрительно пустым?)

+1

Вы также можете использовать http://www.dependencywalker.com/ для просмотра экспортируемых функций. Раньше я использовал вышеупомянутый подход, но трудно сказать, что может произойти неправильно, без дополнительной информации. Вероятно, нужно будет увидеть, как весь проект отлаживает то, что происходит неправильно. –

ответ

1

Я использую версию 1.1.3 и вижу, что теперь есть более новая версия с поддержкой NuGet. Я просто проверил это.

Могу ли я как-то проверить, действительно ли запущена задача MSBuild, которая выполняет всю магию, ?

Вы можете получить более подробную информацию от MSBuild с помощью командной строки или настроить подробность, что запросы Visual Studio: Tools > Options > Project and Solutions > Build and Run > MSBuild project build output verbosity [VS 2010]. Вероятно, вы захотите сбросить его, как только вы закончите поиск и устранение неисправностей.

Я видел, что цель и задача вызывались, но не видели никаких результатов, пока я не переключил платформу проекта на x86. Потом я вижу различные, соответствующие записи в журнале, включая Adding .vtentry:0 .export ....

Что должен содержать файл проекта (это, кажется подозрительно пустой для меня?)

Там не так много требуется в файл проекта. NuGet делает все: ссылка на сборку DllExport и включение для целевого файла.

Пара вещей, которые я могу думать о том, что может быть отключение вас:

  1. Убедитесь, что вы на самом деле построения проекта. Менеджер решений может иметь некоторые проекты, которые не настроены для сборки для выбранной конфигурации решения.
  2. Убедитесь, что вы проверяете правильность DLL. Задача сборки записывает путь в журнал построения. Линия начинается с Assembling.
+0

много часов боролся ... И ваша упомянутая ** точка № 2 ** была резолюцией! Существует так много выходных папок VS, содержащих встроенный файл '* .dll', но все они не работали (не экспортировали функции), только тот, что был в' .. \ ClassLibrary1 \ bin \ x86 \ Debug' на самом деле. Вероятно, новичок, но спасибо: D –

19

Я бы порекомендовал вам сделать это документированным способом вместо того, чтобы полагаться на недокументированный взлом автора, который не предоставляет поддержку. Давайте сделаем это с примером:

namespace Publics { 
    public class Class1 { 
     public static void Run() { 
      // Stuff... 
     } 
    } 
} 

Добавить новую библиотеку классов C++/CLI в ваш проект. Щелкните правой кнопкой мыши решение, Добавить, Новый проект. Откройте узел «Другие языки», Visual C++, CLR и выберите шаблон проекта «Библиотека классов». Щелкните правой кнопкой мыши новый проект «Свойства», «Общие свойства», «Структура и ссылки», нажмите кнопку «Добавить новую ссылку». На вкладке «Проекты» выберите проект C#, метод (ы) которого вы хотите экспортировать.

Удалить предварительно созданный пустой класс с // TODO комментариев и писать подобный код:

extern "C" __declspec(dllexport) 
void __stdcall Example() 
{ 
    Publics::Class1::Run(); 
} 

Построить свое решение. Убедитесь, что функция Example экспортирована, запустив dumpbin.exe/exports в DLL.Вы должны увидеть что-то похожее на это:

 1 0 00001020 [email protected] = [email protected] 

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

extern "C" __declspec(dllexport) 
void __stdcall Example() 
{ 
    Publics::Class1^ obj = gcnew Publics::Class1; 
    obj->Run(); 
} 

Etcetera, некоторое знакомство с языком C++/CLI требуется, если вы собираетесь сделать это сложный , И последнее, но не менее важное: вы также, вероятно, узнаете, что пошло не так в вашей первоначальной попытке сделать работу редактора Jiesecke IL. В противном случае используется тот же метод, который использует компилятор C++/CLI для экспорта управляемого метода.

+2

+1 Я очень ценю этот урок. Я кое-что узнал. Я всегда предполагал, что UnmanagedExports выполняет какую-то черную магию. Очень приятно учиться иначе. –

+0

делает это в моно? – denfromufa

+0

Будет ли функция «Example()» из сборщика/библиотеки смешанного режима, созданная путем компиляции библиотеки классов C++/CLI, которую вы вставили в сообщение, будет доступна из неуправляемого кода (например, Delphi, native C++), как если бы это было обычное чистое неуправляемое DLL? Является ли CLR автоматически запущен, когда неуправляемый код вызывает экспортированную функцию? –

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