2013-10-19 57 views
1

我想使用C#CSharpCodeProvider在飛行中編譯非託管dll。編譯成功,但是,該DLL不起作用。 這裏是我想要做的事:csharpcodeprovider是否支持dllexport?

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

它究竟如何不起作用?你遇到了什麼錯誤? – svick

+0

@svick如果我在CSharpCodeProvider編譯的DLL上執行dumpbin/exports,則該DLL沒有可用的時間戳或函數。但是,使用MSVC 2012編譯的DLL顯示使用dumpbin/exports的時間戳和函數。 – user2855803

回答

3

實際上CSharpCodeProvider確實不是支持DllExport。 C#編譯器Visual Studio也沒有使用它。

你的代碼工作在Visual Studio的原因是因爲the UnmanagedExports NuGet package

一套編譯時庫(沒有部署)和生成任務,使您能夠從託管代碼導出功能,本機應用。

第二部分是重要的:爲了它的工作,它需要一個構建任務來運行。因此,如果您在Visual Studio中安裝該軟件包,它將在正常編譯後運行該構建任務。

但是,如果你只是引用DLL(你用CSharpCodeProvider這樣做,但如果你只是用VS做到這一點,它會表現相同),但它不會起作用。

所以,如果你想要UnmanagedExportsCSharpCodeProvider一起工作,你需要找出一些方法來在那裏運行構建任務。可能最簡單的方法是從構建任務中複製命令並使用Process.Start()運行它們。

+0

你能告訴我關於這個解決方案的更多細節嗎? – Behrooz

+0

@Behrooz你在尋找什麼樣的細節?如果你有一個具體的問題,如果你問了一個新的問題,這可能是最好的。 – svick

+0

謝謝,我需要更多關於如何使用CSharpCodeProvider運行構建任務的細節? – Behrooz