代码之家  ›  专栏  ›  技术社区  ›  user2855803

csharpcodeprovider是否支持dllexport?

  •  1
  • user2855803  · 技术社区  · 11 年前

    我正在尝试使用C#CSharpCodeProvider动态编译一个非托管dll。编译成功,但是dll不起作用。 以下是我想要做的事情:

    provOptions.Add("CompilerVersion", "v4.0");
    var options = new CompilerParameters();
    options.GenerateExecutable = false;
    options.CompilerOptions = "/platform:x86 /target:library";
    options.ReferencedAssemblies.Add("RGiesecke.DllExport.Metadata.dll");
    var provider = new CSharpCodeProvider();
    string sourceFile = "tmp2.cs"; 
    CompilerResults cr = provider.CompileAssemblyFromFile(options, sourceFile);
    

    这里是C#tmp2.cs:

    using RGiesecke.DllExport;
    using System.Runtime.InteropServices;
    using System;
    using System.Text;
    
    class Test
    {
      [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
      public static int TestExport(int left, int right)
      {
         return left + right;
      } 
    }
    

    我做错了什么?CSharpCodeProvider是否不支持Dlexport?tmp2.cs在MS VS C#2012中编译成功,运行良好。

    1 回复  |  直到 11 年前
        1
  •  3
  •   svick Randy Levy    11 年前

    事实上 CSharpCodeProvider 支持 DllExport 。Visual Studio使用的C#编译器也不使用。

    您的代码在Visual Studio中工作的原因是 the UnmanagedExports NuGet package :

    一组编译时库(无需部署)和一个构建任务,使您能够将函数从托管代码导出到本机应用程序。

    第二部分很重要:要使其工作,需要运行一个构建任务。因此,如果您在Visual Studio中安装包,它将在正常编译后运行该构建任务。

    但如果你只是引用DLL(你用 CSharp代码提供程序 ,但如果你只对VS这样做,它的行为也会一样),它不会起作用。

    所以,如果你想 未管理的导出 与合作 CSharp代码提供程序 ,您还需要找到一些方法来运行那里的构建任务。最简单的方法可能是从构建任务中复制命令,然后使用 Process.Start() .

    推荐文章