【发布时间】:2016-02-25 10:55:17
【问题描述】:
我目前正在.Net 中包装 Un4seen BASS 音频库
BASS 函数返回 bool 值,如果返回 false,则需要检查 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);
它编译了,但根本不工作。
谁能指出我错在哪里,或者这样的事情是否可能。
提前致谢。
【问题讨论】:
标签: c# marshalling bass