非托管导出:无法编译程序集

时间:2010-01-11 16:36:54

标签: .net delphi dll unmanaged

我想创建一个可以从非托管代码(Delphi 5)访问的.NET程序集。

我找到Unmanaged Exports并按照那里的步骤进行操作但是我甚至无法成功编译基本示例:

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 SP1,.NET 3.5 SP1

知道什么是错的吗?感谢。


编辑23:40:

我找到了这个bug。它在功能名称中 - 添加添加过于相同。当你改变其中一个时,它就可以了。

4 个答案:

答案 0 :(得分:8)

顺便说一下,我刚刚更新了档案。 当您采用this时,您甚至可以为您准备好所有内容。

这是一个项目模板,可以设置所有内容并且应该可以正常工作。

我确实在之前的版本中找到了一些要点,我做了一些并非总是如此的假设。 我之前实现的一个潜在问题是/ optimize开关,它用于发布配置。在这种情况下,ILAsm有时会扼杀IL,我没有看到新版本。

答案 1 :(得分:1)

万一有人会遇到同样的问题...

我身上有些错误:

file:DllExportAttribute.cs

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

file:$ projectname $ .csproj

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

这些很容易解决。

这是一个非常严肃的问题。从结果\ x86 \ MyDll.dll创建implib时 - lib中的DLL名称更改为\ MyDll.dll ...您可以使用tdump MyDll.dll并将导入部分“\ MyDll.dll”而不是“MyDll” .DLL”。

由于这个问题,使用产生的lib的软件无法找到dll ......在我的情况下,它只能在c:\ MyDll.dll中找到

通过在初始lib上创建“coff2omf -lib:ca MyDll.lib”来解决。但在那之前花了一天时间寻找解决方案......

答案 2 :(得分:0)

似乎导出名称为“add”的[DllExport(“...)]会抛出错误,与”sub“相同。 来自ilasm的vs 2010中的消息是“将文件名汇编到dll ...源文件是UNICODE”。

感谢这项非常棒的工作!

答案 3 :(得分:0)

如果有人也遇到过它,我在导出的函数时也会出现此错误 名称是“init”,因此更改名称解决了问题。

所以这会产生这样的错误:

[DLLEXPORT( “初始化”)]