我正在尝试使用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中编译成功并且工作正常。
答案 0 :(得分:3)
实际上CSharpCodeProvider
不支持DllExport
。 C#编译器也不会使用Visual Studio。
您的代码在Visual Studio中工作的原因是the UnmanagedExports
NuGet package:
一组编译时库(无需部署)和一个构建任务,使您可以将函数从托管代码导出到本机应用程序。
第二部分很重要:要使其工作,需要运行构建任务。因此,如果您在Visual Studio中安装该程序包,它将在正常编译后运行该构建任务。
但是如果你只是引用了DLL(你用CSharpCodeProvider
做的那样,但是如果用VS做的那样它会表现一样),它就不会起作用了。
因此,如果您希望UnmanagedExports
与CSharpCodeProvider
一起使用,您需要找到一些在那里运行构建任务的方法。可能最简单的方法是从构建任务中复制命令并使用Process.Start()
运行它们。