Неуправляемый экспорт: не удается скомпилировать сборку - PullRequest
4 голосов
/ 11 января 2010

Я хочу создать сборку .NET, к которой можно получить доступ из неуправляемого кода (Delphi 5).

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

using RGiesecke.DllExport;

namespace DelphiNET
{
    public class Class1
    {
        [DllExport("add")]
        public static int Add(int left, int right)
        {
            return left + right;
        }
    }
}

DelphiNET.csproj файл проекта:

...
<ItemGroup>
  <Compile Include="Class1.cs" />
  <Compile Include="DllExport\DllExportAttribute.cs" />
  <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="DllExport\RGiesecke.DllExport.targets" />
...

Вот ошибка:

------ Build started: Project: DelphiNET, Configuration: Release Any CPU ------
c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:TRACE /debug:pdbonly /filealign:512 /optimize+ /out:obj\Release\DelphiNET.dll /target:library Class1.cs DllExport\DllExportAttribute.cs Properties\AssemblyInfo.cs

Compile complete -- 0 errors, 0 warnings
DelphiNET -> C:\DelphiNET\bin\Release\DelphiNET.dll
ILDasm: calling 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe' with /quoteallnames /nobar "/out:C:\Documents and Settings\Lukas\Local Settings\Temp\tmp29F\DelphiNET.il" "C:\DelphiNET\bin\Release\DelphiNET.dll"
C:\DelphiNET\bin\Release\DelphiNET.dll : warning EXP0009: Platform is AnyCpu, generating creating binaries for each CPU platform in a separate folder...
ILAsm: calling 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ILAsm.exe' with /nologo "/out:C:\DelphiNET\bin\Release\x86\DelphiNET.dll" "C:\Documents and Settings\Lukas\Local Settings\Temp\tmp29F\DelphiNET.x86.il" /DLL "/resource=C:\Documents and Settings\Lukas\Local Settings\Temp\tmp29F\DelphiNET.res"  /optimize  
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : 
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembling 'C:\Documents and Settings\Lukas\Local Settings\Temp\tmp29F\DelphiNET.x86.il'  to DLL --> 'C:\DelphiNET\bin\Release\x86\DelphiNET.dll'
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Source file is ANSI
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : 
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::get_CallingConvention
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::set_CallingConvention
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::get_ExportName
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::set_ExportName
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : 
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : ***** FAILURE ***** 
C:\DelphiNET\DllExport\RGiesecke.DllExport.targets(8,5): error : 
Done building project "DelphiNET.csproj" -- FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

ОС: WinXPSP3, Microsoft Visual C # 2008 Express Edition с пакетом обновления 1, .NET 3.5 с пакетом обновления 1

Есть идеи, что случилось? Спасибо.


Редактировать 23: 40:

Я нашел ошибку. Это в названии функции - add и Add слишком одинаковы. Когда вы меняете один из них, он работает.

Ответы [ 4 ]

8 голосов
/ 11 января 2010

Кстати, я только что обновил архив. Вы даже можете получить все это за вас, когда вместо этого вы берете это .

Это шаблон проекта, который все настраивает и должен нормально работать.

Я нашел некоторые моменты в предыдущей версии, где я сделал некоторые предположения, которые не всегда были правдой. И одной потенциальной проблемой с моей предыдущей реализацией был ключ / optimize, который используется для конфигураций выпуска. Иногда ILAsm подавлял IL в этом случае, я не видел этого в новой версии.

1 голос
/ 01 апреля 2011

На всякий случай, если кто-то столкнется с такими же проблемами ...

Некоторые ошибки на моей стороне:

файл: DllExportAttribute.cs

public CallingConvention CallingConvention { get; set; }
public string ExportName { get; set; }

файл: $ projectname $ .csproj

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>  <!-- not working -->
<!-- change to -->
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets"/> <!-- working -->

Это легко исправить.

Вот один довольно серьезный. При создании implib из результирующего \ x86 \ MyDll.dll - имя dll в lib изменяется на \ MyDll.dll ... вы можете сделать tdump MyDll.dll и попасть в раздел экспорта "\ MyDll.dll" вместо "MyDll .dll».

Из-за этой проблемы dll не может быть найдена программным обеспечением, использующим результирующий lib ... в моей ситуации это можно найти только в c: \ MyDll.dll

Решено созданием «coff2omf -lib: ca MyDll.lib» в начальной библиотеке. Но до этого потратил день на поиск решения ...

0 голосов
/ 27 октября 2012

Если кто-то также сталкивается с этим, я также получил эту ошибку, когда экспортируемая функция имя было "init", поэтому изменение имени решило проблему.

Так что это выдает такую ​​ошибку:

[DllExport ( "INIT")]

0 голосов
/ 06 октября 2011

Кажется, что [DllExport ("...)] с именем экспорта" add "выдает ошибку, то же самое с" sub ". Сообщение в vs 2010 от ilasm «сборка имени файла в dll ... Исходный файл - UNICODE».

Спасибо за эту действительно замечательную работу!

...