我需要将C ++ File.exe源转换为File.dll。为此,我将此源的配置类型更改为动态库(.dll),Visual Studio构建File.dll而不是File.exe。
现在我试图将这个File.dll用于我的C#项目。这个dll入口点就像:
int wmain(int argc, wchar_t* argv[])
{
// codes
}
之后我将参数传递给CMD中的File.exe,如:
File.exe -l -a "This is first arg !"
但现在事情变得复杂了。我知道在C#代码中使用C ++ dll就像:
[DllImport(@"File.dll" , EntryPoint = "wmain")]
private static extern int wmain(int a , string arg);
我的问题:
1.下面的代码是错的,因为我不知道如何将(wchar_t * argv [])声明为C#变量?!
2.如果我在C#中运行以下代码,它会给出:'Unable to find an entry point named 'wmain' in DLL 'File.dll'.'
所以我似乎应该先做一下,让C#的入口点清晰。那是什么?!
更新1: this link似乎与我的第一个问题具有相同的情况但不同之处在于我使用数组而我找不到相同的类as(wchar_t)在c#中。
答案 0 :(得分:1)
[DllImport(@"File.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
我不是真的使用C#,但是this回答了上面那行可能解决了第二个问题。
关于第一个问题,你必须测试下一个问题以查看它是否有效,但由于IntPtr
与指针大小相同,它应该适用于wchar_t* argv[]
。 也许。哦,差点忘了,你可能需要unsafe
关键字。
public static extern int wmain(int argc, MarshalAs(UnmanagedType.LPArray)] IntPtr[] argv);
我从here得到了这个想法。
同样,我几乎从未使用过C#,但希望这可以帮助您指明正确的方向。