我需要在c#程序中使用非託管的COM dll。 DLL包含一個函數,說:在c中使用dll的問題#
Open(char *name);
但是,當進口到C#(項目 - >添加引用),可用的是:
mydll.Open(ref byte name)
我怎麼能傳遞一個字符串,這個功能呢?
當我這樣做:
byte[] name = new byte[32];
mydll.Open(ref name);
我得到的編譯錯誤 「不能參考字節[]轉換爲ref字節」。
我需要在c#程序中使用非託管的COM dll。 DLL包含一個函數,說:在c中使用dll的問題#
Open(char *name);
但是,當進口到C#(項目 - >添加引用),可用的是:
mydll.Open(ref byte name)
我怎麼能傳遞一個字符串,這個功能呢?
當我這樣做:
byte[] name = new byte[32];
mydll.Open(ref name);
我得到的編譯錯誤 「不能參考字節[]轉換爲ref字節」。
也許你可以做到這一點...
字節[]字節= Encoding.ASCII.GetBytes(myString的);
您可以嘗試裝飾是 「名」 與變量:
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStr)
這是一個單字節,和我認爲與單個字符兼容。如果不是,答案很可能是使用MarshalAs來使該變量看起來像類型。
請記住,如果數組未正確終止,您可能會丟失它。無論如何,我會嘗試傳遞第一個元素字節[0]的指針嘗試:
mydll.Open(ref name [0]);
我不確定interop會如何編組,但值得一試。
如果你的意思是它是一個字符串,那麼在你的IDL文件中,你必須指定這個點代表一個字符串。有關[字符串]屬性的信息,請參閱此文章: http://msdn.microsoft.com/en-us/library/d9a4wd1h%28v=VS.80%29.aspx 如果您希望符合CLS(並與腳本語言進行互操作,則可能需要考慮使用BSTR而不是char *來傳遞字符串)。這樣你也會得到unicode的支持。
除非您給COM提示這是一個字符串,否則無論何時COM需要編組參數(即跨公寓或進程邊界),您都會遇到問題。
這篇文章也可以給你一個很好的起點上C++/C#/ COM超值服務: COM Interop Part 1: C# Client Tutorial
謝謝 - 你的回答爲我解決了同樣的問題。將接口參數更改爲'[in,string] wchar_t *'處理了我的問題。 – 2014-05-29 20:58:45
進口是不正確的。你可以將其導入手動:
[DllImport("<Your COM Dll>")]
private static extern <Return Type> <"Function Name">();
然後,在你的主要方法,或在您初始化您的DLL對象的方法,您需要:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string lpFileName);
public MyDll()
{
Environment.CurrentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string dllPath = Environment.CurrentDirectory + @"<Location of Dll you are importing from>";
LoadLibrary(dllPath);
}
例如,請查看以下COM DLL :
GOIO_DLL_INTERFACE_DECL gtype_int32 GoIO_GetNthAvailableDeviceName(
char *pBuf,
gtype_int32 bufSize,
gtype_int32 vendorId,
gtype_int32 productId,
gtype_int32 N);
我導入此DLL,如下所示:
[DllImport("GoIO_DLL.dll")]
private static extern int GoIO_GetNthAvailableDeviceName(
byte[] pBuf,
int bufSize,
int vendorId,
int productId,
int N);
正如你所看到的,char指針變成了一個byte [],就像你試過的一樣。沒有必要使用ref關鍵字。
你需要傳遞一個指針而不是char – Luiscencio 2010-06-24 22:58:35