2016-06-16 3 views
1

Я пишу DLL с использованием C#, к которому будет обращаться из окна приложений Delphi, и ударил проблему повторно экспортируя классы/методы. Независимо от того, что я пытаюсь, ничего не получается экспортировать.DLL не экспортирует классы/методы C#/C++

Я создал тестовую DLL, используя документированный метод, представленный Hans Passant в this question re UnmangedExports.

Я создал C# проект библиотеки классов со следующим кодом:

namespace ExportTestCS 
{ 
    public class ExpTest 
    { 
    public static void Test() 
    { 
     Console.WriteLine("Hi!"); 
    } 
    } 
} 

и C++ 'обертку', чтобы сделать экспорт:

extern "C" __declspec(dllexport) 

void __stdcall Test() 
{ 
    ExportTestCS::ExpTest::Test(); 
} 

Проект C++ ссылается на # проект C и все это создает в порядке, но когда я запускаю DUMPBIN/экспорт на DLL нет ничего экспортироваться:

dumpbin /exports C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll 

Dump of file C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll 

File Type: DLL 

    Summary 

     2000 .reloc 
     2000 .rsrc 
     2000 .text 

C:\Program Files (x86)\Microsoft Visual Studio 14.0> 

Я запускал dumpbin против всех DLL, созданных сборкой для отладки и выпуска, и все они дают одинаковый результат.

Таким образом, мой вопрос - что я делаю неправильно? Я потратил много времени на то, чтобы тралить вокруг подобных вопросов, но все они, похоже, решаются с использованием оболочки C++ или UnmangedExports.

Оба проекта строятся для x86/win32 и имеют одну и ту же целевую структуру (4.5.2). Я пробовал различные комбинации статических классов, классов, __clrcall/__ stdcall и т. Д., Но безрезультатно.

Я также ранее пробовал пакет UnmanagedExports NuGet без успеха (так я нашел ответ Ганса).

Заранее благодарим за любую помощь!

После всех комментариев (спасибо!) Я подтвердил, что это проект динамической библиотеки, и я создал новую папку в проекте C++ и установил ее как выходную папку. Теперь сборка помещает файлы .lib, .exp, .pdb, .dll и .dll.metagen в эту папку, и это папка с сообщением на вкладке вывода при создании. Но до сих пор нет радости, выход из свалки такой же, как и всегда!

Когда я бегу DUMPBIN против файла .lib в новой папке выходной я получаю это:

Dump of file C:\Temp\ExportTest\ExportTestCPP\ExportTest\Output\exporttest.lib 

File Type: LIBRARY 

    Exports 

     ordinal name 

        [email protected] 

    Summary 

      CC .debug$S 
      14 .idata$2 
      14 .idata$3 
      4 .idata$4 
      4 .idata$5 
      10 .idata$6 

C:\Program Files (x86)\Microsoft Visual Studio 14.0> 

Так это выглядит, как .lib экспортирует метод испытания, но не в финальной DLL?

+1

Возможно, вы используете Dumpbin.exe в неправильной DLL при условии, что он находится в каталоге ExportTestCS. Вы должны запустить его в DLL, созданной вашим проектом на C++. Вы также должны будете убедиться, что * обе библиотеки DLL могут быть найдены в вашем тестовом проекте. –

+0

Длинный снимок - вы установили [сборка: ComVisible (true)] из [assembly: ComVisible (false)] в AssemblyInfo? –

+0

Я искал папки проекта для всех DLL-файлов, и они существуют только в проекте C#? Я попробую установить параметр AssemblyInfo и посмотреть, не изменилось ли это. – Mick

ответ

1

Я просто попробовал ваш пример, и это сработало для меня, когда я запускал dumpbin на dll C++, но дал тот же результат, что и ваш, когда я запускал его с dll C#.

Dump of file C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll 

Это ваша сборка C#?

+0

Да, это моя сборка C# - в файле C++ отсутствует DLL-файл. каталоги? – Mick

+0

Вы можете увидеть выходную папку для вашей C++ DLL в окне вывода сразу после сборки. Эта папка должна содержать как сборку C#, так и C++ DLL. – leetibbett

+0

Возможно, вы выбрали статическую библиотеку вместо динамической? – leetibbett

0

Проблема была в том, как я бы поставил проекты. Я начал с нуля, и все получилось нормально.

Когда я устанавливал исходные проекты ExportTest, я непреднамеренно создал библиотеку классов Windows Universal для проекта C#, и хотя я понял и изменил ее на стандартный проект библиотеки классов Windows (удалил оригинал и создал новый). I верьте, что это должно было оставить что-то позади в конфигурации решения, которая препятствовала экспорту DLL.

Большое спасибо всем, кто ответил/комментировал!

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