Сейчас я оберточной Un4seen BASS аудио библиотеки в .NETMarshal BOOL возвращение пользовательского Return <bool>
функции BASS возвращает значение bool
, требует проверки LastError
знать ошибки, которая произошла, если возвращается ложь.
Так я реализовал Return<T>
класс, чтобы сделать его объектно-ориентированный:
using ManagedBass.Dynamics;
namespace ManagedBass
{
/// <summary>
/// Wraps a Bass Error in a function return value
/// </summary>
/// <typeparam name="T">The Type of the function return value</typeparam>
public class Return<T>
{
public Errors ErrorCode { get; }
Return(T Value)
{
ErrorCode = Bass.LastError;
this.Value = Value;
}
public T Value { get; }
public static implicit operator T(Return<T> e) => e.Value;
public static implicit operator Return<T>(T e) => new Return<T>(e);
public bool Success => ErrorCode == Errors.OK;
}
}
Теперь методы, как:
[DllImport(DllName, EntryPoint = "BASS_StreamFree")]
public static extern bool StreamFree(int Handle);
Я бы вместо этого хочу вернуть Return<bool>
, так что пользователь может легко проверьте ErrorCode
объектно-ориентированным способом.
Теперь, вы можете сказать, что я создаю еще один метод, как:
// bool implicitly converts to Return<bool>
public static Return<bool> StreamFree2(int Handle) => StreamFree(Handle)
Но, проблема в том, что уже есть тысячи DllImports и делать это для всех из них был бы кошмар.
Итак, я попробовал:
[DllImport(DllName, EntryPoint = "BASS_StreamFree")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern Return<bool> StreamFree(int Handle);
Составлен, но не работает.
Может ли кто-нибудь указать мне, где я ошибаюсь или что-то подобное возможно.
Спасибо заранее.
Благодарим вас за подробный ответ. –
BTW Есть ли способ получить функцию, вызванную после вызова каждой функции –
Я слышал что-то подобное о CodeContracts.Могу ли я использовать это, чтобы выбросить Exception –