|
|
adamhill9 wrote: this web page suggests both Express versions can be installed You're right, multiple sites suggest so. Good one
Some additional resources from Microsoft that might be handy;
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Great stuff, thanks for those links they will be a great place to start.
|
|
|
|
|
Eddy Vluggen wrote: only one of the Express versions can be installed at a time. No, they happily co-exist on the same system. VS2013 Express[^] has 3 versions: Desktop (C++, C#, VB.NET), Web (ASP.NET) and Windows (appstore and phone).
|
|
|
|
|
Nice one, thanks for the confirmation.
|
|
|
|
|
|
Actually, you're looking at two different things. Visual Studio Online is not the Visual Studio IDE in the cloud. There is one feature of VSO that does enable you to edit code in the cloud, but it's only for websites deployed to Azure. See: Visual Studio Online "Monaco" videos on Channel 9.
Visual Studio Online is essentially a cloud implementation of Team Foundation Server with some additional cloud-based functionality. You should go ahead and create a free Visual Studio Online Basic account. That'll give you a place in the cloud for online source control. As you learn to code, you should also learn how to work with source control.
Express for Windows Desktop is the IDE heir to what was once Visual Basic Express, Visual C# Express, and Visual C++ Express. All three of those products (2010 era) are now what comprises Express for Windows Desktop. It's the best starting point for learning to code with any of those languages, and it connects to Visual Studio Online. For ASP.NET development, you'll need a separate Express product: Express for Web.
Check out: Get Started: Create your app to work with VSO
And: Getting Started with Visual C# and Visual Basic
Rob Caron MSFT
|
|
|
|
|
Many thanks this is great info to know.
|
|
|
|
|
Agree with others. Go with Visual Studio Express. If you need cross platform option(some people use VMs to run other OS), use MonoDevelop[^]. FYI one more open source IDE SharpDevelop[^] there as an alternative.
|
|
|
|
|
For a start to learn then you can start programming from anyone of basic or express 2013
Sankarsan Parida
|
|
|
|
|
Hey, all. Been after this one a few days and it's driving me crazy. I've refactored several times based on information I've found on the net (i.e. event handlers, circular references, etc) but I'm just not getting anywhere.
What I have is a generic hierarchical data structure that is distributed over a LAN via TCP. The concept was that I wanted to be able to share variables between applications over networked machines using a common protocol. The problem is whenever I run the thing and watch the process with Process Explorer, I can see a steady increase in Physical Memory usage (WS Private). I have a test application that accesses the nodes in the tree several times a second and can watch it climb (app consumes about 50 MB of memory when idle and then climbs at about 300 K per second). By playing around and commenting/uncommenting various blocks of code, I've narrowed the problem down to whenever the nodes in the tree are being accessed. At first I was certain that the problem was in the implementation of my object hierarchy because I had circular references (children had a reference to their parents) and figured that was messing up GC. But then I redid the implementation to remove that relationship and it's still happening. This is really driving me nuts.
Here's some (abridged) code. I can provide more if needed but don't want this to turn into a novel outright.
First, the object hierarchy:
Starts with a MustInherit base class: Node
Node is just a basic node in the tree. Everything that lives in the tree must inherit from this class.
ContainerNode:
Inherits from Node. It has an internal sortable dynamic list of Node instances and includes methods necessary to traverse that list (HasChildren, etc).
Cluster:
Inherits from ContainerNode. A Cluster is a collection of related nodes. A Cluster is the top most object in the tree. A Cluster contains a list of Groups and DataNodes.
Group:
Inherits from ContainerNode. A Group is a collection of related nodes within a Cluster. A Group contains more Groups and DataNodes.
DataNode:
Inherits from Node. A DataNode is a variable "leaf" item on the tree. It can be any kind of basic data type (string, integer, etc, etc).
The whole tree is accessed through a class called Agent. The Agent provides the methods necessary to add and remove nodes and set their values. It also sends changes in the tree out to the network and receives requests from connected clients over the network to modify the tree.
Nodes on the tree each have a signature, which looks pretty similar to a directory path in Linux (/Cluster/Group/Group/DataNode). I don't deal with relative paths.
So after a bunch of screwing around I've traced the problem down to whenever I access a node on the tree. Up at the App level, I have the following:
If (m_Service.NodeValue(Path.ToString & "/ParamID") = ParamType) Then
Return m_Service.NodeValue(Path.ToString & "/AutoCalc")
End If
This corresponds to a property in a class called Service, which exposes the Agent and everything else to client applications (this whole thing is packed into a class library).
Public Property NodeValue(ByVal Path As String) As Object
Get
Return m_Agent.NodeValue(Path)
End Get
Set(ByVal value As Object)
m_Agent.NodeValue(Path) = value
End Set
End Property
Within Agent, there is the following:
Public Property NodeValue(ByVal Path As String) As Object
Get
Try
Return DirectCast(Me.GetNode(Path), Tree.DataNode).Value
Catch ex As Exception
Return Nothing
End Try
End Get
Set(ByVal value As Object)
Try
Dim N As DataNode = DirectCast(Me.GetNode(Path), Tree.DataNode)
If (N IsNot Nothing) Then
If (N.NodeVal <> value) Then
N.NodeVal = value
If (Me.SuppressEvents = False) Then
OnValueChanged(N.Signature.ToString, value)
End If
End If
End If
Catch ex As Exception
End Try
End Set
End Property
GetNode does this:
Public Function GetNode(ByVal Path As String) As Node
If (m_Nodes.IsEmpty) Then
Return Nothing
End If
If (String.IsNullOrEmpty(Path)) Then Return Nothing
If (Path.Equals("/")) Then
m_Nodes.First()
Return m_Nodes.Current
End If
If (Path.Substring(0, 1).Equals("/")) Then
Return AbsolutePath(Path)
End If
Return Nothing
End Function
Private Function AbsolutePath(ByVal Path As String) As Node
Path = Path.TrimStart("/")
Dim Data() As String = Path.Split("/")
If (Data.Length > 0) Then
Dim Index As Integer = m_Nodes.GetItemIndex(New SearchNode(Data(0)))
AbsolutePath = m_Nodes.AtIndex(Index)
If ((AbsolutePath IsNot Nothing) And (Data.Length > 1)) Then
For X As Integer = 1 To Data.Length - 1
If (AbsolutePath IsNot Nothing) Then
If (AbsolutePath.HasChildren) Then
AbsolutePath = DirectCast(AbsolutePath, ContainerNode).Child(Data(X))
Else
Return Nothing
End If
Else
Return Nothing
End If
Next
End If
Return AbsolutePath
End If
Return Nothing
End Function
Now, through testing, I've found that calling GetNode is enough to make the memory leak occur. That means no events firing and nothing else special, just a simple GetNode, which returns the Node instance back to the caller.
It seems to me that this should be something that the language should be able to handle, so I'm either missing something fundamental or I'm nowhere near as knowledgeable as I'd like to believe.
I greatly appreciate any help, hints, or insight you can provide.
Thanks much.
|
|
|
|
|
You're either generating more objects (and faster) than the GC can clean up and manage, or you're keeping a reference to those objects somewhere. Is there a custom paint-handler somewhere in the application?
Put the mouse on a suspicious class, and hit Shift-F12. That should give you a list of all the places where the class is being used.
Another quick and dirty way would be to implement IDisposable , and have the class log a line whenever an object is created (in the constructor) and when it is disposed of.
The best way would be to use a (commercial) memory-profiler. You'll get a nice graphic showing what's been allocated at what point. Microsoft also provides a tool of course, with their "howto" here[^].
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
No custom paint handlers.
Been doing some digging on this using sos.dll (just learned how to use it today). What I'm seeing is a heavy accumulation of WeakReference objects (as below).
00415b08 7247 115952 Panasonic.Cumulus.NodeSignature
004a2cc0 21 131492 Free
5c912ee4 1289 164388 System.Int32[]
00265dc8 7959 222852 Panasonic.Navigation.Airport
00416170 6145 294960 Panasonic.Cumulus.Tree.SearchNode
5c910964 40147 481764 System.Object
00266320 33732 1484208 Panasonic.Lists.Vector`1[[System.String, mscorlib]]
5c90a4f8 106481 1703696 System.WeakReference
5c8e4518 43721 1754732 System.Object[]
5c910d48 75853 4065948 System.String
00625b08 6250 100000 Panasonic.Cumulus.NodeSignature
00482cc0 21 132216 Free
5c912ee4 1080 139412 System.Int32[]
00125dc8 7959 222852 Panasonic.Navigation.Airport
00626170 5290 253920 Panasonic.Cumulus.Tree.SearchNode
5c910964 29503 354036 System.Object
00126320 23956 1054064 Panasonic.Lists.Vector`1[[System.String, mscorlib]]
5c90a4f8 70067 1121072 System.WeakReference
5c8e4518 31679 1526020 System.Object[]
5c910d48 70002 3827708 System.String
00625b08 994 15904 Panasonic.Cumulus.NodeSignature
5c912ee4 223 22208 System.Int32[]
00626170 730 35040 Panasonic.Cumulus.Tree.SearchNode
00482cc0 22 131548 Free
00125dc8 7959 222852 Panasonic.Navigation.Airport
5c910964 19523 234276 System.Object
00126320 18547 816068 Panasonic.Lists.Vector`1[[System.String, mscorlib]]
5c8e4518 21952 2319992 System.Object[]
5c90a4f8 170293 2724688 System.WeakReference
5c910d48 58574 3265092 System.String
00625b08 3853 61648 Panasonic.Cumulus.NodeSignature
5c912ee4 698 88716 System.Int32[]
00626170 3184 152832 Panasonic.Cumulus.Tree.SearchNode
5c910964 16087 193044 System.Object
00125dc8 7959 222852 Panasonic.Navigation.Airport
00126320 12652 556688 Panasonic.Lists.Vector`1[[System.String, mscorlib]]
00482cc0 17208 1438032 Free
5c910d48 61646 3463780 System.String
5c8e4518 17493 3603972 System.Object[]
5c90a4f8 334571 5353136 System.WeakReference
00625b08 1227 19632 Panasonic.Cumulus.NodeSignature
5c912ee4 258 27292 System.Int32[]
00626170 933 44784 Panasonic.Cumulus.Tree.SearchNode
00125dc8 7959 222852 Panasonic.Navigation.Airport
5c910964 19907 238884 System.Object
00126320 18727 823988 Panasonic.Lists.Vector`1[[System.String, mscorlib]]
5c910d48 59022 3288024 System.String
5c8e4518 22302 4688996 System.Object[]
00482cc0 34649 5804452 Free
5c90a4f8 562981 9007696 System.WeakReference
I've seen the numerous posts regarding this that suggest you just recompile in Release rather than Debug mode, however that isn't the case here - I can still see the memory climb when I run the app.
I've tried dumping some of the objects and all it seems to point to is a floating system.object:
Scan Thread 3128 OSTHread c38
Scan Thread 5780 OSTHread 1694
Scan Thread 6204 OSTHread 183c
Scan Thread 2680 OSTHread a78
Scan Thread 3232 OSTHread ca0
DOMAIN(007D3988):HANDLE(Pinned):1b13fc:Root:03501010(System.Object[])->
02502074(System.Collections.Generic.List`1[[System.WeakReference, mscorlib]])->
035b0df8(System.Object[])->
02a2fe9c(System.WeakReference)
I was fairly certain I had all the events issues sorted but perhaps not. I'll go through and take a closer look at the difference classes involved (using your shift-f12 suggestion) and see if I can find anything likely.
Thanks for the response.
|
|
|
|
|
Right, found the answer. Thought I'd post how I did it here for anyone else who gets stuck on something like this.
First thing I did was a bunch of reading to school myself on memory leaks in .NET, how they're created, and how to hunt them down. I recommend the following articles:
Best Practices No. 5: Detecting .NET application memory leaks[^]
Memory Leak Detection in .NET[^]
I also downloaded Process Explorer and used that as a general tool to monitor application performance and judge if what I was doing had any useful impact at all.
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx[^]
It's important to note that before doing any of the above, I had already traced down the sections of code in my program that were creating the link. There are various ways to do this. For me, I had at least a general idea of the method calls causing the problem, so I began systematically commenting out blocks of code and re-running the app while watching Process Explorer. I eventually got to a point where the leak stopped occurring, at which point it became clear to me where this was happening. So lesson 1, it turns out that finding the leak can be pretty easy; fixing it might be not as straight forward.
I used sos.dll to dump my heap memory while running the program to see exactly what it was that was causing the usage to blow up. I'll note here that my platform is Win7 64 bit and my program was configured to target any CPU, which caused issues when I tried to click the "Enable unmanaged code debugging" check box in the project properties window. I had to set the target CPU to x86 to get that to work. Everything else as presented in the article I linked above concerning sos.dll worked as described (I used !dumpheap, !gcroot, etc commands from the immediate window in my case).
What I found was that I had a large number of System.WeakReference instances hanging around and not getting cleaned up. You can see where I discuss this earlier in this thread. From what I've read on the net, it seems that the biggest cause of this happening is when you instantiate object that add event handlers and then don't remove those handlers properly later when you're done with the object. I thought that this wasn't a problem in my code because I had rewritten it to minimize events and handlers as much as possible.
Even so, it turns out that I'm an idiot.
A long time ago, I wrote a generic interface for my class library that describes a basic set of debugging/logging events and handlers for any class that I wanted to be able to write information to my own home-rolled logging system. Very simple stuff; in a nutshell:
Public Interface CoreEvents
Event InfoMessage(ByVal e As EventInfo)
Sub OnInfo(ByVal Message As String)
Sub OnInfo(ByVal e As EventInfo)
Event Err(ByVal e As EventErr)
Sub OnErr(ByVal Description As String)
Sub OnErr(ByVal e As EventErr)
Event Exception(ByVal e As EventBaseException)
Sub OnException(ByVal e As System.Exception)
Sub OnException(ByVal e As EventBaseException)
Event Debug(ByVal e As EventDebug)
Sub OnDebug(ByVal Message As String)
Sub OnDebug(ByVal e As EventDebug)
Event Warning(ByVal e As EventWarning)
Sub OnWarn(ByVal Message As String)
Sub OnWarn(ByVal e As EventWarning)
End Interface
This works out fine when you have a few root classes that implement it that you expect to live throughout the life of the program. But when I wrote this, it worked out so well for me and made my life so easy that it became common practice for my to implement this in any new class I created.
So, I had some very low level items in the object hierarchy (node, signatures, etc, etc) all inheriting from a single master object: SortElement. SortElement is a custom object I wrote that anything can inherit from and become something that can be sorted rapidly in a Vector class that I wrote at some point. Guess what interface SortElement implements? Yep: CoreEvents. Duh.
So I went back and cleaned that up and remove that interface from anything that doesn't need it or shouldn't get it (specifically, objects likely to be instantiated and then dumped on a moment's notice like list nodes or helper classes like NodeSignature.
As an added measure, I also implemented the following pattern in my code for any objects that I wanted to make doubly sure would get sorted out by the GC:
http://msdn.microsoft.com/en-us/library/s9bwddyx%28v=vs.90%29.aspx[^]
I wrapped all that up and rebuilt and was met with an app that consumes no more than 35 MB of memory while running (before it was consuming something like 300 K per second perpetually until running into an OOM exception).
I also find it relevant to note that I did not have to rebuild the application under Release config (rather than Debug) as many forum posts out there suggest (I'm building against .net 3.5).
Anyway, hope some folks find this helpful. I'm actually rather thankful I came across this; it was maddening but well worth what I learned when dealing with it.
|
|
|
|
|
Hi all,
My web application was working perfectly. There was no issue with that.
Suddenly I was need to add a reference of System.Web.Helpers.ddl in my project. After adding this in my project I am getting an error
Cannot implicitly convert type 'System.DateTime' to 'var' on this line var date = DateTime.Now.AddYears(i);
before this it was working perfectly, I didn't made any change in my code.
<pre lang="c#">protected void Bind_Year()
{
try
{
DataTable dt = new DataTable();
dt.Columns.Add("Year", typeof(int));
for (int i = -2; i < 4; i++)
{
var date = DateTime.Now.AddYears(i);
var year = date.Year;
dt.Rows.Add(year);
}
DropDownList3.DataSource = dt;
DropDownList3.DataBind();
}
catch (Exception ex)
{
WebMsgBox.Show(ex.Message);
}
}</pre>
|
|
|
|
|
Perhaps something defines var as something it shouldn't?
Either way, replace var with the actual type, it serves no purpose here.
|
|
|
|
|
This is not the right solution,I have 30 pages where i used this code.
Why I need to change it? although It was working fine before adding the reference.
|
|
|
|
|
Or remove the reference and see if it goes away. Your choice.
|
|
|
|
|
I really hate to tell you this but the size of the problem does not justify whether the solution is "right" or not. If you didn't make a bad coding decision in the first place and use it across 30 pages the solution wouldn't be so big either.
Creating a type called "var" is a bad idea as is naming any of your types after a reserved word in any language. It just leads to ambiguity problems for the compiler (as you've found out) and makes it very difficult to understand the code and debug it.
C# keywords list[^]
|
|
|
|
|
so you mean, I need to change it in all 30 pages? is there no another way to solve it?
|
|
|
|
|
|
It looks like the included reference may have brought in some definition for var . Easy to test, just remove that reference and see if the error goes away. You should also be able to use intellisense to look at the definition of var in your code.
|
|
|
|
|
Yes, very right.
Sorry Sir, the issue has been solved. Actually I don't have any idea that how a class file named var.cs came in my App_Code folder, after adding reference to System.Web.Helpers ddl. Now I have deleted it.
That class file was making problem.
Anyway thanks.. Smile
|
|
|
|
|
Hi, I am opening the UDL file from Browse button in WPF application. After clicking on OK button of UDL wizard connection information should be displayed in WPF application's Datagrid. Please give me any way to do this.
modified 5-Aug-14 1:38am.
|
|
|
|
|
Please don't crosspost. If you Google a bit you'll find the format[^]. You read it in the same way as a textfile, and display it on a form.
Good luck.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|