Как маршал int* в C#?
Я хотел бы вызвать этот метод в неуправляемой библиотеке:
void __stdcall GetConstraints(
unsigned int* puiMaxWidth,
unsigned int* puiMaxHeight,
unsigned int* puiMaxBoxes
);
Мое решение:
Определение делегата:
[UnmanagedFunctionPointer (CallingConvention.StdCall)] закрытый делегат void GetConstraintsDel(UIntPtr puiMaxWidth, UIntPtr puiMaxHeight, UIntPtr puiMaxBoxes);
Вызов метода:
// PLUGIN NAME GetConstraintsDel getConstraints = (GetConstraintsDel)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(GetConstraintsDel)); uint maxWidth, maxHeight, maxBoxes; unsafe { UIntPtr a = new UIntPtr(&maxWidth); UIntPtr b = new UIntPtr(&maxHeight); UIntPtr c = new UIntPtr(&maxBoxes); getConstraints(a, b, c); }
Это работает, но я должен разрешить "небезопасный" флаг. Есть ли решение без небезопасного кода? Или это решение нормально? Я не совсем понимаю последствия установки проекта с небезопасным флагом.
Спасибо за помощь!
1 ответ
Решение
Просто вышел?
то есть:
HRESULT GetTypeDefProps (
[in] mdTypeDef td,
[out] LPWSTR szTypeDef,
[in] ULONG cchTypeDef,
[out] ULONG *pchTypeDef,
[out] DWORD *pdwTypeDefFlags,
[out] mdToken *ptkExtends
);
отлично работает с:
uint GetTypeDefProps
(
uint td,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)]char[] szTypeDef,
uint cchTypeDef,
out uint pchTypeDef,
out uint pdwTypeDefFlags,
out uint ptknds
);
Образец использования;
char[] SzTypeDef;
uint CchTypeDef;
uint PchMember;
IntPtr PpvSigBlob;
uint PbSigBlob;
SzTypeDef= new char[500];
CchTypeDef= (uint)SzTypeDef.Length;
ResPT=
MetaDataImport.GetTypeDefProps
(
td,
SzTypeDef,
CchTypeDef,
out pchTypeDef,
out pdwTypeDefFlags,
out ptkExtends
);