1

我正在尝试使用 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 中编译成功并且工作正常。

4

1 回答 1

3

其实CSharpCodeProvider不支持。_ DllExportC# 编译器 Visual Studio 也不使用。

您的代码在 Visual Studio 中工作的原因是NuGetUnmanagedExports

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

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

但是,如果您只是引用 DLL(您使用CSharpCodeProvider.

所以,如果你想UnmanagedExports使用CSharpCodeProvider,你也需要想办法在那里运行构建任务。可能最简单的方法是从构建任务中复制命令并使用Process.Start().

于 2013-10-20T10:26:36.293 回答