my own very similar question ürününü aşağıdaki gibi cevaplayabiliyorum. Sanırım (test etmediğim halde) bunun durumunuz için de hiçbir değişiklik olmadan çalışabileceğini düşünüyorum. Tek fark, std :: string kullanıyorum ve char * kullanıyor olmanızdır, ancak SWIG'in bunları da aynı şekilde ele aldığını düşünüyorum.
Bağlantılı Kodlar Proje makalesinde bulunan David Jeske yardım (read: genius!) Yardımı ile, bu soruyu en sonunda yanıtlayabildim.
C# kitaplığınızda bu sınıfa (David Jeske'nin kodundan) ihtiyacınız olacak.
%typemap(imtype, inattributes="[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]", outattributes="[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]") string "string"
ve hat 61 üzerinde
, bu satırı değiştirin: bu hat ile
%typemap(imtype) string "string"
: Bu satırı yerine hat 24 yudum yönettiği "std_string.i", içinde Sonra
public class UTF8Marshaler : ICustomMarshaler {
static UTF8Marshaler static_instance;
public IntPtr MarshalManagedToNative(object managedObj) {
if (managedObj == null)
return IntPtr.Zero;
if (!(managedObj is string))
throw new MarshalDirectiveException(
"UTF8Marshaler must be used on a string.");
// not null terminated
byte[] strbuf = Encoding.UTF8.GetBytes((string)managedObj);
IntPtr buffer = Marshal.AllocHGlobal(strbuf.Length + 1);
Marshal.Copy(strbuf, 0, buffer, strbuf.Length);
// write the terminating null
Marshal.WriteByte(buffer + strbuf.Length, 0);
return buffer;
}
public unsafe object MarshalNativeToManaged(IntPtr pNativeData) {
byte* walk = (byte*)pNativeData;
// find the end of the string
while (*walk != 0) {
walk++;
}
int length = (int)(walk - (byte*)pNativeData);
// should not be null terminated
byte[] strbuf = new byte[length];
// skip the trailing null
Marshal.Copy((IntPtr)pNativeData, strbuf, 0, length);
string data = Encoding.UTF8.GetString(strbuf);
return data;
}
public void CleanUpNativeData(IntPtr pNativeData) {
Marshal.FreeHGlobal(pNativeData);
}
public void CleanUpManagedData(object managedObj) {
}
public int GetNativeDataSize() {
return -1;
}
public static ICustomMarshaler GetInstance(string cookie) {
if (static_instance == null) {
return static_instance = new UTF8Marshaler();
}
return static_instance;
}
}
, Bu satırda:
%typemap(imtype) const string & "string"
Bu satırda:
%typemap(imtype, inattributes="[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]", outattributes="[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]") string & "string"
Her şey işe yarıyor. Bunun nasıl çalıştığını iyi anlamak için bağlantılı makaleyi okuyun.