Get SizeConst value for array in struct
I have some (generated) c++ code that declares the following struct in a DLL:
[StructLayout(LayoutKind::Sequential, Pack = 4)] public value struct typeData
{
public:
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 8)] array<UINT8> ^ a1;
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 20)] array<UINT8> ^ a2;
};
From my C# application, I would like to find out the expected lengths of the arrays (8 and 20 in the example).
I have loaded the DLL, and created an instance of the object as
dll = Assembly.LoadFrom("data.dll");
var t = dll.GetType("typeData");
var obj = Activator.CreateInstance(t);
Can I get the desired information from the type or the object? Or in some other way?
c#
|
show 1 more comment
I have some (generated) c++ code that declares the following struct in a DLL:
[StructLayout(LayoutKind::Sequential, Pack = 4)] public value struct typeData
{
public:
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 8)] array<UINT8> ^ a1;
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 20)] array<UINT8> ^ a2;
};
From my C# application, I would like to find out the expected lengths of the arrays (8 and 20 in the example).
I have loaded the DLL, and created an instance of the object as
dll = Assembly.LoadFrom("data.dll");
var t = dll.GetType("typeData");
var obj = Activator.CreateInstance(t);
Can I get the desired information from the type or the object? Or in some other way?
c#
These declarations nail down the view that native code sees. After the pinvoke marshaler is done with it you get the managed struct, these become plain arrays you use every day. With a Length property that will be 8 and 20. That doesn't happen until you actually make the call. It is not like you can't dig it out with Reflection, FieldInfo.GetCustomAttribute(), it is merely painful and almost certainly not needed. Also do keep in mind that this is pretty unusual in C++/CLI, you'd simply use the native struct type you got from the .h file to make the call.
– Hans Passant
Nov 26 '18 at 13:15
Hmm, which call are you referring to? There is no native code for me to call in this case. I only have the value struct declaration in the dll. I would use this information from my C# application to interpret binary data that has been generated by a different native application. And also to verify that the individual array sizes in the struct definition corresponds to what my application expects.
– matli
Nov 26 '18 at 15:04
Whatever call that generated this struct. Usually, it is sometimes also used to interpret binary data in a file or stream, takes Marshal.PtrToStructure(). The outcome is not very different, you get the managed struct back with the arrays at the size you'd want them, their Length property is not going to be a surprise. I do need to guess when you ask about a solution without describing the problem it is supposed to solve.
– Hans Passant
Nov 26 '18 at 15:14
Ok, I know it's difficult to guess my situation. It is also quite difficult to describe the system without making huge simplifications. However, in the most basic case, let's say the only thing I have is the DLL as described, containing the value struct definition. I also have a specification, from another source, telling me that the struct should contain one 8-byte field and one 20-byte field, in that order. I want to be able to verify that the struct as defined in the DLL corresponds to this.
– matli
Nov 26 '18 at 15:27
If the native declaration does not match then you get garbage data. That's never very hard to detect with human eyes powered by a debugger. No, there is no way to discover the native declaration if you don't use the .h file. Native code does not have anything resembling reflection. Since this appears to be auto-generated, SWIG perhaps, there isn't a lot of reason to assume there is a mismatch.
– Hans Passant
Nov 26 '18 at 15:35
|
show 1 more comment
I have some (generated) c++ code that declares the following struct in a DLL:
[StructLayout(LayoutKind::Sequential, Pack = 4)] public value struct typeData
{
public:
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 8)] array<UINT8> ^ a1;
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 20)] array<UINT8> ^ a2;
};
From my C# application, I would like to find out the expected lengths of the arrays (8 and 20 in the example).
I have loaded the DLL, and created an instance of the object as
dll = Assembly.LoadFrom("data.dll");
var t = dll.GetType("typeData");
var obj = Activator.CreateInstance(t);
Can I get the desired information from the type or the object? Or in some other way?
c#
I have some (generated) c++ code that declares the following struct in a DLL:
[StructLayout(LayoutKind::Sequential, Pack = 4)] public value struct typeData
{
public:
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 8)] array<UINT8> ^ a1;
[MarshalAs(UnmanagedType::ByValArray, SizeConst = 20)] array<UINT8> ^ a2;
};
From my C# application, I would like to find out the expected lengths of the arrays (8 and 20 in the example).
I have loaded the DLL, and created an instance of the object as
dll = Assembly.LoadFrom("data.dll");
var t = dll.GetType("typeData");
var obj = Activator.CreateInstance(t);
Can I get the desired information from the type or the object? Or in some other way?
c#
c#
asked Nov 26 '18 at 12:58
matlimatli
14.3k62935
14.3k62935
These declarations nail down the view that native code sees. After the pinvoke marshaler is done with it you get the managed struct, these become plain arrays you use every day. With a Length property that will be 8 and 20. That doesn't happen until you actually make the call. It is not like you can't dig it out with Reflection, FieldInfo.GetCustomAttribute(), it is merely painful and almost certainly not needed. Also do keep in mind that this is pretty unusual in C++/CLI, you'd simply use the native struct type you got from the .h file to make the call.
– Hans Passant
Nov 26 '18 at 13:15
Hmm, which call are you referring to? There is no native code for me to call in this case. I only have the value struct declaration in the dll. I would use this information from my C# application to interpret binary data that has been generated by a different native application. And also to verify that the individual array sizes in the struct definition corresponds to what my application expects.
– matli
Nov 26 '18 at 15:04
Whatever call that generated this struct. Usually, it is sometimes also used to interpret binary data in a file or stream, takes Marshal.PtrToStructure(). The outcome is not very different, you get the managed struct back with the arrays at the size you'd want them, their Length property is not going to be a surprise. I do need to guess when you ask about a solution without describing the problem it is supposed to solve.
– Hans Passant
Nov 26 '18 at 15:14
Ok, I know it's difficult to guess my situation. It is also quite difficult to describe the system without making huge simplifications. However, in the most basic case, let's say the only thing I have is the DLL as described, containing the value struct definition. I also have a specification, from another source, telling me that the struct should contain one 8-byte field and one 20-byte field, in that order. I want to be able to verify that the struct as defined in the DLL corresponds to this.
– matli
Nov 26 '18 at 15:27
If the native declaration does not match then you get garbage data. That's never very hard to detect with human eyes powered by a debugger. No, there is no way to discover the native declaration if you don't use the .h file. Native code does not have anything resembling reflection. Since this appears to be auto-generated, SWIG perhaps, there isn't a lot of reason to assume there is a mismatch.
– Hans Passant
Nov 26 '18 at 15:35
|
show 1 more comment
These declarations nail down the view that native code sees. After the pinvoke marshaler is done with it you get the managed struct, these become plain arrays you use every day. With a Length property that will be 8 and 20. That doesn't happen until you actually make the call. It is not like you can't dig it out with Reflection, FieldInfo.GetCustomAttribute(), it is merely painful and almost certainly not needed. Also do keep in mind that this is pretty unusual in C++/CLI, you'd simply use the native struct type you got from the .h file to make the call.
– Hans Passant
Nov 26 '18 at 13:15
Hmm, which call are you referring to? There is no native code for me to call in this case. I only have the value struct declaration in the dll. I would use this information from my C# application to interpret binary data that has been generated by a different native application. And also to verify that the individual array sizes in the struct definition corresponds to what my application expects.
– matli
Nov 26 '18 at 15:04
Whatever call that generated this struct. Usually, it is sometimes also used to interpret binary data in a file or stream, takes Marshal.PtrToStructure(). The outcome is not very different, you get the managed struct back with the arrays at the size you'd want them, their Length property is not going to be a surprise. I do need to guess when you ask about a solution without describing the problem it is supposed to solve.
– Hans Passant
Nov 26 '18 at 15:14
Ok, I know it's difficult to guess my situation. It is also quite difficult to describe the system without making huge simplifications. However, in the most basic case, let's say the only thing I have is the DLL as described, containing the value struct definition. I also have a specification, from another source, telling me that the struct should contain one 8-byte field and one 20-byte field, in that order. I want to be able to verify that the struct as defined in the DLL corresponds to this.
– matli
Nov 26 '18 at 15:27
If the native declaration does not match then you get garbage data. That's never very hard to detect with human eyes powered by a debugger. No, there is no way to discover the native declaration if you don't use the .h file. Native code does not have anything resembling reflection. Since this appears to be auto-generated, SWIG perhaps, there isn't a lot of reason to assume there is a mismatch.
– Hans Passant
Nov 26 '18 at 15:35
These declarations nail down the view that native code sees. After the pinvoke marshaler is done with it you get the managed struct, these become plain arrays you use every day. With a Length property that will be 8 and 20. That doesn't happen until you actually make the call. It is not like you can't dig it out with Reflection, FieldInfo.GetCustomAttribute(), it is merely painful and almost certainly not needed. Also do keep in mind that this is pretty unusual in C++/CLI, you'd simply use the native struct type you got from the .h file to make the call.
– Hans Passant
Nov 26 '18 at 13:15
These declarations nail down the view that native code sees. After the pinvoke marshaler is done with it you get the managed struct, these become plain arrays you use every day. With a Length property that will be 8 and 20. That doesn't happen until you actually make the call. It is not like you can't dig it out with Reflection, FieldInfo.GetCustomAttribute(), it is merely painful and almost certainly not needed. Also do keep in mind that this is pretty unusual in C++/CLI, you'd simply use the native struct type you got from the .h file to make the call.
– Hans Passant
Nov 26 '18 at 13:15
Hmm, which call are you referring to? There is no native code for me to call in this case. I only have the value struct declaration in the dll. I would use this information from my C# application to interpret binary data that has been generated by a different native application. And also to verify that the individual array sizes in the struct definition corresponds to what my application expects.
– matli
Nov 26 '18 at 15:04
Hmm, which call are you referring to? There is no native code for me to call in this case. I only have the value struct declaration in the dll. I would use this information from my C# application to interpret binary data that has been generated by a different native application. And also to verify that the individual array sizes in the struct definition corresponds to what my application expects.
– matli
Nov 26 '18 at 15:04
Whatever call that generated this struct. Usually, it is sometimes also used to interpret binary data in a file or stream, takes Marshal.PtrToStructure(). The outcome is not very different, you get the managed struct back with the arrays at the size you'd want them, their Length property is not going to be a surprise. I do need to guess when you ask about a solution without describing the problem it is supposed to solve.
– Hans Passant
Nov 26 '18 at 15:14
Whatever call that generated this struct. Usually, it is sometimes also used to interpret binary data in a file or stream, takes Marshal.PtrToStructure(). The outcome is not very different, you get the managed struct back with the arrays at the size you'd want them, their Length property is not going to be a surprise. I do need to guess when you ask about a solution without describing the problem it is supposed to solve.
– Hans Passant
Nov 26 '18 at 15:14
Ok, I know it's difficult to guess my situation. It is also quite difficult to describe the system without making huge simplifications. However, in the most basic case, let's say the only thing I have is the DLL as described, containing the value struct definition. I also have a specification, from another source, telling me that the struct should contain one 8-byte field and one 20-byte field, in that order. I want to be able to verify that the struct as defined in the DLL corresponds to this.
– matli
Nov 26 '18 at 15:27
Ok, I know it's difficult to guess my situation. It is also quite difficult to describe the system without making huge simplifications. However, in the most basic case, let's say the only thing I have is the DLL as described, containing the value struct definition. I also have a specification, from another source, telling me that the struct should contain one 8-byte field and one 20-byte field, in that order. I want to be able to verify that the struct as defined in the DLL corresponds to this.
– matli
Nov 26 '18 at 15:27
If the native declaration does not match then you get garbage data. That's never very hard to detect with human eyes powered by a debugger. No, there is no way to discover the native declaration if you don't use the .h file. Native code does not have anything resembling reflection. Since this appears to be auto-generated, SWIG perhaps, there isn't a lot of reason to assume there is a mismatch.
– Hans Passant
Nov 26 '18 at 15:35
If the native declaration does not match then you get garbage data. That's never very hard to detect with human eyes powered by a debugger. No, there is no way to discover the native declaration if you don't use the .h file. Native code does not have anything resembling reflection. Since this appears to be auto-generated, SWIG perhaps, there isn't a lot of reason to assume there is a mismatch.
– Hans Passant
Nov 26 '18 at 15:35
|
show 1 more comment
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481651%2fget-sizeconst-value-for-array-in-struct%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481651%2fget-sizeconst-value-for-array-in-struct%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
These declarations nail down the view that native code sees. After the pinvoke marshaler is done with it you get the managed struct, these become plain arrays you use every day. With a Length property that will be 8 and 20. That doesn't happen until you actually make the call. It is not like you can't dig it out with Reflection, FieldInfo.GetCustomAttribute(), it is merely painful and almost certainly not needed. Also do keep in mind that this is pretty unusual in C++/CLI, you'd simply use the native struct type you got from the .h file to make the call.
– Hans Passant
Nov 26 '18 at 13:15
Hmm, which call are you referring to? There is no native code for me to call in this case. I only have the value struct declaration in the dll. I would use this information from my C# application to interpret binary data that has been generated by a different native application. And also to verify that the individual array sizes in the struct definition corresponds to what my application expects.
– matli
Nov 26 '18 at 15:04
Whatever call that generated this struct. Usually, it is sometimes also used to interpret binary data in a file or stream, takes Marshal.PtrToStructure(). The outcome is not very different, you get the managed struct back with the arrays at the size you'd want them, their Length property is not going to be a surprise. I do need to guess when you ask about a solution without describing the problem it is supposed to solve.
– Hans Passant
Nov 26 '18 at 15:14
Ok, I know it's difficult to guess my situation. It is also quite difficult to describe the system without making huge simplifications. However, in the most basic case, let's say the only thing I have is the DLL as described, containing the value struct definition. I also have a specification, from another source, telling me that the struct should contain one 8-byte field and one 20-byte field, in that order. I want to be able to verify that the struct as defined in the DLL corresponds to this.
– matli
Nov 26 '18 at 15:27
If the native declaration does not match then you get garbage data. That's never very hard to detect with human eyes powered by a debugger. No, there is no way to discover the native declaration if you don't use the .h file. Native code does not have anything resembling reflection. Since this appears to be auto-generated, SWIG perhaps, there isn't a lot of reason to assume there is a mismatch.
– Hans Passant
Nov 26 '18 at 15:35