Tengo un fragmento de código .NET que quiero transferir a 64 bits. Los códigos básicamente son un conjunto de llamadas P/Invoke a algún otro C dll. Una de las funciones en el dll C tiene un parámetro 'size_t'. ¿Qué tipo de datos debo usar en mi firma de P/Invoke para que la clasificación funcione bien? Estaba pensando en usar un IntPtr o un UIntPtr, pero algunos dicen que son un puntero equivalente en .NET y no deberían usarlo. ¿Alguien sabe cuál es el tipo correcto para esto?.NET equivalente de size_t
Respuesta
Si size_t varía según la plataforma, tendrá que usar IntPtr. Si es un entero de tamaño fijo, use int, uint o long (dependiendo de la declaración original).
echar un vistazo a este Document by Microsoft
Dice para size_t aplicación de 64 bits es de 64 bits int.
Sin embargo, si el archivo DLL que está llamando es una DLL de 32 bits, sólo tiene que pasar un int de 32 bits
he encontrado un truco sucio que puede ayudar a lograr un comportamiento similar. Se requiere que se defina un símbolo compilación _WIN64
para su 64 bits construye y entonces usted puede hacer lo siguiente:
#if _WIN64
using size_t = UInt64;
#else
using size_t = UInt32;
#endif
Nota: usted tendrá que usar el código anterior en todos los archivos que desea utilizar el tipo size_t
.
También puede definir su propio tipo de entero (como UInt64 está definido) y reutilizarlo sin tener que poner el código anterior en cada archivo que necesita acceso a size_t
, pero es muy complicado (imho).
#if _WIN64
using _size_t = UInt64;
#else
using _size_t = UInt32;
#endif
[Serializable]
[CLSCompliant(false)]
[ComVisible(true)]
public struct size_t : IComparable, IFormattable, IConvertible, IComparable<_size_t>, IEquatable<_size_t>
{
private _size_t _value;
public size_t(_size_t val)
{
_value = val;
}
// You have to add all of your overloads below
}
Esto permitirá size_t
para cambiar su tipo dependiendo de la plataforma, pero la sobrecarga correctamente los operadores necesarios es muy difícil!
Tener que definir el símbolo de compilación significa que esto no funcionará para ninguna compilación de CPU, y se bloqueará si alguien modifica el ejecutable para que se ejecute como algo más (x86/x64). –
@ ØysteinE.Krog Estoy de acuerdo, también generalmente descubro que realmente no necesita 'size_t' a menos que esté trabajando con un dll C++, por lo que en ese caso no compilaría con Any CPU y debería funcionar. Es un hack lo suficientemente sucio que hay muy pocos casos que justifiquen su uso. – Kiril
- 1. Existe un equivalente a size_t en llvm
- 2. .net equivalente de htmlunit?
- 3. .NET equivalente de StrCmpLogicalW
- 4. ¿Transmitir de size_t a int o iterar con size_t?
- 5. GWT equivalente para .NET?
- 6. JMS equivalente en .Net
- 7. ShellExecute equivalente en .NET
- 8. .NET JAXB equivalente?
- 9. .NET equivalente para GetLastInputInfo?
- 10. equivalente de Maven para .Net
- 11. .NET equivalente de Java's List.subList()?
- 12. std :: size_t vs size_t vs std :: string :: size_type
- 13. size_t contra uintptr_t
- 14. printf for size_t
- 15. 'size_t' vs 'container :: size_type'
- 16. comparación con int size_t
- 17. ¿Manera correcta de reunir SIZE_T *?
- 18. Java equivalente a .NET System.InvalidOperationException
- 19. ¿Hay una RRDTool .net equivalente
- 20. .NET equivalente a Delphi's forceDirectory
- 21. Equivalente de cargadores de clase en .NET
- 22. .NET Equivalente de la herramienta de recorte
- 23. Java ¿Equivalente a DateTime.Parse de .NET?
- 24. .Net equivalente al AssertionError de Java
- 25. Java equivalente a la NotSupportedException de .Net
- 26. ¿Hay un equivalente de JMS en .NET?
- 27. equivalente de Java para MEF en .NET
- 28. ¿Hay .NET equivalente a ActionList de Delphi?
- 29. El equivalente .NET de bibliotecas estáticas?
- 30. ¿Qué es .NET equivalente de InterruptedException (Java)?
¿Qué "bit-ness" es la DLL de C? –