csharpcodeprovider是否支持dllexport?

时间:2013-10-19 20:29:54

标签: c# unmanaged dllexport csharpcodeprovider

我正在尝试使用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不支持Dllexport吗? tmp2.cs在MS VS C#2012中编译成功并且工作正常。

1 个答案:

答案 0 :(得分:3)

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

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

  

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

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

但是如果你只是引用了DLL(你用CSharpCodeProvider做的那样,但是如果用VS做的那样它会表现一样),它就不会起作用了。

因此,如果您希望UnmanagedExportsCSharpCodeProvider一起使用,您需要找到一些在那里运行构建任务的方法。可能最简单的方法是从构建任务中复制命令并使用Process.Start()运行它们。