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していませDllExport。また、Visual Studio が使用する C# コンパイラも同様です。

コードが Visual Studio で機能する理由はUnmanagedExportsNuGet パッケージのためです。

マネージ コードからネイティブ アプリケーションに関数をエクスポートできるようにする一連のコンパイル時ライブラリ (デプロイするものは何もありません) とビルド タスク。

2 番目の部分は重要です。これを機能させるには、ビルド タスクを実行する必要があります。そのため、パッケージを Visual Studio にインストールすると、通常のコンパイル後にそのビルド タスクが実行されます。

しかし、DLL を参照するだけの場合 ( CSharpCodeProvider.

UnmanagedExportsしたがって、 で作業したい場合はCSharpCodeProvider、ビルド タスクをそこで実行する方法も考え出す必要があります。おそらく最も簡単な方法は、ビルド タスクからコマンドをコピーし、Process.Start().

于 2013-10-20T10:26:36.293 に答える