|
What is the best class(es) to use to get the properties of the system your app is running on.
For example:
Total RAM
Video Card
Detailed CPU info
etc.
I have tried some articles but the classes they suggest are either obsolete or incomplete.
Thanks.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
|
Thanks. I did use this. It has some info but is limited on the hardware details.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
I use a mix of System.Environment, WMI classes (System.Management), Win32 functions (through P/Invoke), some registry accesses, and some assembly code, and still I'm not getting all I would like to collect.
FWIW: MS guidelines will tell you your app shouldn't be interested nor care. However I understand knowing the characteristics of a platform and logging them can be very relevant in debugging an app with multiple and various customers.
|
|
|
|
|
Thanks. Can you provide a little more detail please. Class names, ...
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
I'm not going to copy dozens of class names, methods, dlls, function names.
If you have a very specific requirement, I'll see what I can provide.
And it wouldn't hurt if you explained a bit why you need those things, the best way may depend on it, as accuracy, performance and prerequisites may vary.
|
|
|
|
|
Sorry. I did not realize that would be necessary. Thanks for the guidance. I'll try to take it from here.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
Luc Pattyn wrote: knowing the characteristics of a platform and logging them can be very relevant in debugging an app with multiple and various customers
That's terribly true!
|
|
|
|
|
Precisely. That is one reason I would like to have the techniques in place. I do use an exception capture form and logging system that encourages user input and email responses from the form.
Having a good relevant H/W and S/W profile is very useful. Many users cannot answer/or will not answer questions about there configurations.
I am making some progress on getting more details. I am not happy with it yet. Any ideas on Classes to use and Code snippets are welcome.
Thanks.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
|
|
Thanks. These all look useful.
The first reference is one I found before. I have not figured out how to create the code to use it yet. Any tips?
The WMI tool will save lots of time as I get in deeper. Pinvoke looks super, but will take some ramp-up to get the value from it.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
|
Thanks for the reply.
It looks like the following is the key, as you suggest:
using System;
using System.Management;
ManagementClass c = new ManagementClass(
new ManagementPath("Win32_LogicalDisk"));
PropertyDataCollection properties =
c.Properties;
...
I can see the WMI code creator is a strong helper as well.
The Help System has an extensive list for "Computer System Hardware Classes" to use with WMI.
This looks like it may have the detail I am looking for.
There are a number of C# classes like DriveInfo, NetworkInterface, ... that may be better choices once you discover them. The WMI is organized so that it may be easier to use.
Poking around on this topic has lead me to more useful namespaces and classes, at least.
Thanks to all for the guidance.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
Just be aware that some of the data isn't supported on some OS versions. Along with that some things like the WMI Installer Providers are not installed by default on operating systems such as Server 2003.. so you would get a "Invalid Class" error if you run into that problem.
|
|
|
|
|
Thanks for the clarification. I downloaded the WMI Provider to review this.
Using the WMI code generator and adapting the code for a Forms app with a little extra logic and code here and there is going well. They use the ManagementObjectSearcher. My reading recommends this as a preferred approach.
I am proceeding well on this now.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
Use WMI[^].
The funniest thing about this particular signature is that by the time you realise it doesn't say anything it's too late to stop reading it.
My latest tip/trick
Visit the Hindi forum here.
|
|
|
|
|
Hi All,
At the moment I'm converting the body of word and other documents to type Byte array using the following:
Byte[] b = Convert.FromBase64String(attach.Body);
This works fine for most word documents apart from those that have a body formatted using html tags. The result is that an exception is thrown "System.FormatException: Invalid character in a Base-64 string."
Does anyone know how I can convert the html formatted word document into a Byte array?
Thank you,
Mel
|
|
|
|
|
That is completely wrong. Do you have any idea what Base64 is? it only accepts 64 different characters and is intended for encoding binary data into text, making it ready for easy transmission or storage. You can't feed arbitrary text to Convert.FromBase64String and get away with it.
What you need depends on the context, which you didn't make clear. It may be simply reading an existing file as binary data (using File.Read or ReadAllBytes); or writing existing data to a MemoryStream, then calling MemoryStream.ToArray().
|
|
|
|
|
In that case maybe I assume you're saying I'm using the Base64 in the wrong way.
The only reason I'm using it is to convert the body of an attachment into a Byte array and then pass that byte array to a memory steam, which is then written to a FileStream.
Byte[] b = Convert.FromBase64String(attach.Body);
System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);
FileStream fsFile = File.OpenWrite(strTarPath + "\\" + strFName);
mem.WriteTo(fsFile);
MemoryStream takes in a Byte array and this is the reason for the convertion.
I looked for MemoryStream.ToArray() but it doesn't seem to exist.
Any ideas?
Thanks,
Mel
|
|
|
|
|
MWRivera wrote: I'm using the Base64 in the wrong way
No. You are not using it in the wrong way. It is wrong for you to use base64 at all.
Now explain what you need or want in functional terms, then people might be able to help you.
I will not provide any code, not even a class name, as long as you don't explain your goals.
|
|
|
|
|
Functional Terms
The code should take email attachments and save them to a directory, renaming the files in the process.
If anyone can provide help with this, I would really appreciate it.
Thank you,
Mel
|
|
|
|
|
well, you did not explain what an "email attachment" is; is it a file on disk to which you have a path? is it in memory? as a string? as a byte array?
Your OP had "attach.Body" in the code snippet but no declarations; a MailMessage has a Body property which is a string (BTW: a MailMessage should not be called attach IMO).
if the attachment is a string, get it and use File.WriteAllText; if it is a byte array, use File.WriteAllBytes.
PS: Please learn to help everyone, including yourself, by asking clear questions, providing all essential information.
|
|
|
|
|
Base64 is a number system - normal numbers like 1, 2, 3 are decimal or Base10, binary is Base2 etc.
Byte[] b = Convert.FromBase64String(attach.Body);
This would make sense IF "attach.Body" was in fact a Base64 string. Base64 still confuses me dude, so don't let Luc Pattyn make you feel bad for not being born with the intrinsic knowledge of Base64 and its use, as he must have been in order to provide him the right to speak to someone like that (I think a swing at his demeaning tone is fair enough, don't you ).
What type is the attach.Body property, is it a just a basic System.String? If you want to convert a string into a byte array, there are plenty of ways to do it, and it's something that comes up often (and I can NEVER remember how to do it). It also depends on the type of encoding you want.
In the System.Text namespace there are several Encoding classes: I usually use ASCIIEncoding:
string myText = "Hello world!";
ASCIIEncoding enc = new ASCIIEncoding();
byte[] dataBuffer = enc.GetBytes(myText);
There is also the UTF8Encoding class I can think of off the top of my head. The type of encoding you use does matter!
Having said all this, it seems like you're doing something odd. Can you explain to me what your actual intention is with "converting the html formatted word document into a Byte array"? What do you want to do that for? And then you said later that you wanted to save these files out to a directory. If I was you, I would do something like this:
using (var fileStream = new FileStream("theNewFileName.txt", FileMode.Create)
{
using (var streamWriter = new StreamWriter(fileStream)
{
streamWriter.Write(attach.Body);
}
}
Using the StreamWriter class, you can interact at a higher level and use strings rather than byte arrays - much clearer and simpler code IMHO.
Does this help?
|
|
|
|
|
NickHighIQ wrote: don't let Luc Pattyn make you feel bad for not being born with the intrinsic knowledge of Base64 and its use
Obviously I disagree.
1.
Yes, I happen to know for a long time what base64 means (something similar was used by Digital Equipment 30 years ago in their radix50 encoding they used to stuff three characters in a 16-bit word). However there is no need for such "intrinsic knowledge" to realize the approach is inappropriate. All it takes is reading up on the classes/methods used.
This is the very first line MSDN[^] offers about Convert.FromBase64String:
Converts the specified String, which encodes binary data as base 64 digits, to an equivalent 8-bit unsigned integer array.
I don't think of digits when a Word document has to be handled somehow. Not in base 10, not in hex, and not in a binary encoding of some kind.
When reading on, the same MSDN page also offers a good example, with encoding and decoding code, and encoded/decoded data. How it would fit the job at hand is a mystery to me, and I would hope to anyone who has looked at that page.
2.
I did not intend any demeaning tone, and frankly I don't see one. What I do here is providing information, advice, and guidelines. A universal guideline is this: read up on the class or method you are considering but are not familiar with.
|
|
|
|