|
Correct, but it will still be popped out of the stack when it goes out of scope. The second example definitely does get destroyed by the GC.
My main points were that the increasing the scope out of the loop, both decreases the readability, and takes an (an albeit small) amount of memory while [edit- removed Geordie English] it remains in scope.
ragnaroknrol The Internet is For Porn[^]
Pete o'Hanlon: If it wasn't insulting tools, I'd say you were dumber than a bag of spanners.
modified on Monday, July 19, 2010 12:16 PM
|
|
|
|
|
Keith Barrow wrote: Correct, but it will still be popped out of the stack when it goes out of scope.
No it won't, it will get an entry in the .locals section and its value will stay valid even though it would be "out of scope" according to C# - and the JIT compiler is an idiot and will permanently (as long as the stack frame is active) allocate stack space for it at least while a debugger is attached (not sure how to get the optimized code)
|
|
|
|
|
Wow, that is carp (by which I mean a little brown fish or sorts ) design. Still, you learn something new everyday I suppose.
Are there any article around about how this stuff works (I mean the relationship between the call stack an the variables that get declared and how these unwind, rather than GC)? I have just realised that I have no clue what happens under the hood, and I hate not knowing stuff ( and sadly there is a lot of stuff I don't know....).
ragnaroknrol The Internet is For Porn[^]
Pete o'Hanlon: If it wasn't insulting tools, I'd say you were dumber than a bag of spanners.
|
|
|
|
|
I don't know about articles.. I just took a look at the disassembly window in the debugger, and at the MSIL view in the Reflector
Local variables are "destroyed" (that is, they will be at a lower address than ESP) in the function epilogue, temporary variables (from expression evaluation) in MSIL live on the operand stack and in the Actual* Code they are in registers (unless there are too many, then they get some stack space as well)
* But all that is still based on the "JIT without optimizations" since I can't figure out how to get the real, optimized, code. I've tried doing a kernel32@DebugBreak but then it refuses to debug any managed code and gets stuck in some native stack frames..
|
|
|
|
|
Keith Barrow wrote: there is a lot of stuff I don't know...
There is but one consoling thought: the more you study, the more you realize the things you don't know are growing in number even more rapidly.
|
|
|
|
|
This is true. I studied so much that I realised I was learning less and less about more and more, so now I know nothing about anything.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
Pete O'Hanlon wrote: so now I know nothing about anything.
However you succeed rather well at hiding that.
|
|
|
|
|
I have come across this artice:
g Returned XML with C#
and I want to know what's the best way from the listed ways to read weather.com weather xml data feed using C#?
|
|
|
|
|
jrahma wrote: I want to know what's the best way
According to the article that you're linking to;
"The simplest way to view the returned data is to get the response stream and put it into a string."
I'd say the simplest approach that works would be the best
I are Troll
|
|
|
|
|
If the url returns a .xml or .atom you can try read using XmlReader or if you want a full html code, use WebClient.
|
|
|
|
|
Hi !
I have a big problem, I try to create a parental control (which use the hosts file in windows).
So, I have look the "RtlSetProcessIsCritical" sample code in C/C++. But, I'm a CSharp developer.
My source code is :
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace RtlSetProcessIsCriticalCSharp
{
unsafe public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllName);
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
delegate long *ProcessIsCriticalDelegate(
[MarshalAs(UnmanagedType.Bool)]bool bNew, bool *pbOld,
[MarshalAs(UnmanagedType.Bool)]bool bNeedScb);
public Form1()
{
InitializeComponent();
}
unsafe private void Form1_Load(object sender, EventArgs e)
{
IntPtr ntdll = LoadLibrary("ntdll.dll");
IntPtr ProcAdd = GetProcAddress(ntdll, "RtlSetProcessIsCritical");
ProcessIsCriticalDelegate pcd = (ProcessIsCriticalDelegate)Marshal.GetDelegateForFunctionPointer(ProcAdd, typeof(ProcessIsCriticalDelegate));
pcd(true, null, false);
}
}
}
No error, nothing.
The article about RtlSetProcessIsCritical :
"Protecting" Your Process with RtlSetProcessIsCritical
Can you help me ? Sorry for my bad english, I'm french.
|
|
|
|
|
Seems you want to call an existing native function. All it takes is a little P/Invoke, there is no need to load libraries, use delegates, and such. You might learn what you need by reading this unfinished article[^] and watching some of its examples.
|
|
|
|
|
[DllImport("ntdll.dll")]<br />
unsafe public static extern int RtlSetProcessIsCritical(Boolean bNew, Boolean* pbOld, Boolean bNeedScb);<br />
<br />
public Form1()<br />
{<br />
InitializeComponent();<br />
}<br />
<br />
unsafe private void Form1_Load(object sender, EventArgs e)<br />
{<br />
RtlSetProcessIsCritical(true, null, false);<br />
}
Here my new code, but doesn't work... :/
|
|
|
|
|
According to the article, the function is
typedef long ( WINAPI *RtlSetProcessIsCritical ) (
IN BOOLEAN bNew,
OUT BOOLEAN *pbOld,
IN BOOLEAN bNeedScb );
Looking at that I think you may have a problem with your second parameter - try:
[DllImport("ntdll.dll")]
public static extern int RtlSetProcessIsCritical(bool bNew, out bool pbOld, bool bNeedScb);
DaveIf this helped, please vote & accept answer!
Binging is like googling, it just feels dirtier.
Please take your VB.NET out of our nice case sensitive forum.(Pete O'Hanlon)
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)
|
|
|
|
|
Doesn't work. And I have the administrator privileges.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
[DllImport("ntdll.dll", SetLastError = true)]
unsafe public static extern int RtlSetProcessIsCritical(bool bNew, out bool pbOld, bool bNeedScb);
public Form1()
{
InitializeComponent();
}
unsafe private void Form1_Load(object sender, EventArgs e)
{
bool outer;
RtlSetProcessIsCritical(true, out outer, true);
}
}
}
|
|
|
|
|
OK - this is interesting so I've done a little more investigation. It seems that the function you are trying to use actually calls ZwSetInformationProcess . This[^] forum thread indicates that it may not be availble on Vista/Weven and is probably not valid on any 64bit OSes. Also, an Administrator account may not be high enough, System privileges may be required. I don't know if any of these apply to you but if so then that could be the reason.
If not, you need to check the error code set by SetLastError and get the relavant error message string.
DaveIf this helped, please vote & accept answer!
Binging is like googling, it just feels dirtier.
Please take your VB.NET out of our nice case sensitive forum.(Pete O'Hanlon)
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)
|
|
|
|
|
Night Lol wrote: but doesn't work...
that is not informative.
what happened to the PRE tags?
did you understand the article you referred to?
does the Win32 function return a status, does it use GetLastError? did you check them?
don't you need to manipulate some privileges?
have you ever used Google on this subject?
|
|
|
|
|
Yes, I have used google.
I have the administrator privileges (In the article, we use SE_DEBUG privilege), I have read some parts of the article.
|
|
|
|
|
This is from an example in Professional C#2008 from Wrox Chap 17, p491.
Using a VS2008 C# class library project I've created a simple shared assembly. I've used the string name tool to create a name "sn -k mykey.snk" and used the VS Project | Properties | Signing tab to sign the assembly with this key. After building, by using idlview, I can view the key in the manifest. Opening a VS Command prompt to RunAs Administrator I've installed it using "gacutil /i SharedDemo.dll".
But I can't seem to reference it from a VS2008 C# Console Application project. From Solution Explorer I right-click the solution and use Add Reference. I can find the assembly in C:\Windows\assembly using the Add Reference Browse tab but am unable to select it. The book says "... referenced in the same way as a private assembly..."
I'm not trying any Delayed Signing, just to make a compile time reference. I tried starting VS2008 with RunAs Administrator but it made no difference. Any ideas appreciated.
The assembly is in the GAC as shown by:
>gacutil /l SharedDemo
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.21022.8 Copyright (c) Microsoft Corporation. All rights reserved.
The Global Assembly Cache contains the following assemblies:
SharedDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c5bbc6da95e06b44, processorArchitecture=MSIL
Number of items = 1
modified on Monday, July 19, 2010 10:02 AM
|
|
|
|
|
I think you're doing it wrong. Don't try to reference the assembly in the GAC, just try to reference the assembly in the directory where you created it and the system will figure out the rest. That's what works for me. Your application shouldn't have to know whether or not the assembly is in the GAC.
|
|
|
|
|
You seem to be right. In my client console project I referenced the local copy of the shared assembly SharedDemo.dll which I was able to do. But if I rename the local directory the console client still runs OK which must prove it using the shared one in the GAC.
Thanks
|
|
|
|
|
Hello Everyone,
I have one simple static HTML file, with a table i am trying to extract the contents of the table to a file.
can anyone please give some some suggestions how to proceed with this work.
HTML File:-
<html>
<body>
<table border="1">
<tr>
<th>Team Name</th>
<th>Place</th>
</tr>
<tr>
<td>Kings XI Punjab</td>
<td>Punjab</td>
</tr>
<tr>
<td>Chennai Super Kings</td>
<td>Chennai</td>
</tr>
<tr>
<td>Deccan Chargers</td>
<td>Hydrabad</td>
</tr>
</table>
</body>
</html>
I am trying to extract the text with this code :-
using System.Diagnostics;
using System.Net;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System;
using System.IO;
using System.Linq;
class Program
{
static void Main()
{
StreamReader str = new StreamReader("C:\\Sample1.html");
string strLings = str.ReadToEnd();
int startIndex = strLings.IndexOf("<table>");
int endInedx = strLings.IndexOf("</table>") + "</table>".Length - startIndex;
string strTab = strLings.Substring(startIndex, endInedx);
str.Close();
StreamWriter strWr = new StreamWriter("C:\\test2.txt", true);
strWr.Write(strTab);
strWr.Close();
}
}
Problem is i am getting an error
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
Additional information: StartIndex cannot be less than zero.
|
|
|
|
|
As you already figured out, a table starts and ends with a TABLE tag, holds rows delimited by TR tags, which in turn hold columns delimited by TD tags. You did make two mistakes:
1. tags can be upper- or lower-case in HTML (XHTML requires lower-case);
2. opening tags may contain extra information (see the border='1' attribute in your example).
So code accordingly, either by providing your own GetDelimitedSubstring() method (similar to what you already have), or by using Regex.
|
|
|
|
|
Thanks Luc Pattyn for the response.
I corrected the mistakes as follows
HTML File :-
<html>
<body>
<table>
<tr>
<th>Team Name</th>
<th>Place</th>
</tr>
<tr>
<td>Kings XI Punjab</td>
<td>Punjab</td>
</tr>
<tr>
<td>Chennai Super Kings</td>
<td>Chennai</td>
</tr>
<tr>
<td>Deccan Chargers</td>
<td>Hydrabad</td>
</tr>
</table>
</body>
</html>
Program :-
<br />
static void Main()<br />
{<br />
StreamReader str = new StreamReader("C:\\Test.html");<br />
string strLings = str.ReadToEnd();<br />
int startIndex = strLings.IndexOf("<table>");<br />
int endInedx = strLings.IndexOf("</table>") + "</table>".Length - startIndex;<br />
string strTab = strLings.Substring(1, endInedx);<br />
str.Close();<br />
StreamWriter strWr = new StreamWriter("C:\\test2.txt", true);<br />
strWr.Write(strTab);<br />
strWr.Close();<br />
<br />
Console.ReadLine();<br />
}<br />
Getting the output as below written to the file ..
Not getting the required out put .. I will try with Regular Expression now.
html>
<body>
<table>
<tr>
<th>Team Name</th>
<th>Place</th>
</tr>
<tr>
<td>Kings XI Punjab</td>
<td>Punjab</td>
</tr>
<tr>
<td>Chennai Super Kings</td>
<td>Chennai</td>
</tr>
<tr>
<td>Deccan Chargers</td>
<td>Hydrabad</td>
</tr
|
|
|
|
|