代码之家  ›  专栏  ›  技术社区  ›  Lukas Cenovsky

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

  •  4
  • Lukas Cenovsky  · 技术社区  · 14 年前

    我想创建一个可以从非托管代码(Delphi5)访问的.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速成版,带SP1,.NET 3.5 SP1

    知道怎么了吗?谢谢。


    编辑23:40:

    我找到了虫子。它是以函数的名称- 添加 添加 太一样了。当你改变其中一个的时候,它会起作用。

    4 回复  |  直到 11 年前
        1
  •  8
  •   Robert Giesecke    14 年前

    顺便说一下,我刚刚更新了档案。 你甚至可以把所有的事情都安排好,当你 this 相反。

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

    我确实在以前的版本中找到了一些观点,在那里我做了一些并不总是正确的假设。 我以前实现的一个潜在问题是用于发布配置的/optimize开关。在这种情况下,ILASM有时会被IL阻塞,我还没有在新版本中看到这一点。

        2
  •  1
  •   Adruin    13 年前

    以防有人遇到同样的问题…

    我这方面的一些错误:

    文件: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 -->
    

    这些很容易修复。

    这是一个相当严肃的问题。当从生成的\x86\mydll.dll生成implib时-lib中的dll名称更改为\mydll.dll…您可以设置tdump mydll.dll,并将进入导出部分“\mydll.dll”,而不是“mydll.dll”。

    由于这个问题,使用结果库的软件找不到dll…在我的情况下,只能在c:\my dll.dll中找到它

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

        3
  •  0
  •   krossner    13 年前

    似乎导出名为“add”的[dllexport(“…)]引发了一个错误,与“sub”相同。 来自ILASM的VS2010中的消息是“正在将文件名组装到dll…源文件是Unicode”。

    谢谢你的出色工作!

        4
  •  0
  •   Ohad    12 年前

    如果有人也遇到了它,当导出函数 名称是“init”,因此更改名称修复了问题。

    所以这就产生了这样一个错误:

    [dllexport(“init”)]