I’ve had a comment that my previous post explaining how to install .NET 3.5 in Windows 2000 wasn’t very clear, so I’ll try to clarify it a little…
First of all, let me explain how it works. .NET is actualy 2 separate things. There is the .NET runtime, which deals with interpreting the MSIL intermediate code and executing it. There is also the .NET Framework, which are all the libraries containing the classes that you usually code with in .NET.
In theory, the .NET runtime can be used without the .NET framework (although you’d probably need a couple of DLLs to define things like the basic types). You could use an entirely different framework which sits on top of the same runtime and is compiled to MSIL. I’m not aware of any that exist though.
The really interesting bit is that there are actually only 3 versions of the .NET runtime – 1.0, 1.1 and 2.0. 1.0 and 1.1 are used for the corresponding framework versions, but 2.0 is used for running framework 2.0, 3.0 and 3.5.
In fact, in terms of the framework, 3.0 is 2.0 plus some extra stuff, and 3.5 is 3.0 plus extra stuff. The trick which I rely on is that you can install 2.0 in Windows 2000 and just add the extra stuff that you need.
For my purposes, all I needed was support for Linq and Linq to SQL and a few other bits and bobs. All this is available in .NET Assembly DLL files. you just need to make sure that the assemblies are available to be loaded by the application you are running.
You also need to make sure that you have any prerequisites for those assemblies, because a lot of them will access classes in other assemblies. There are 2 ways of dealing with that. You can either copy in the entire set of DLLs, or you can keep running your program and looking to see what assembly it can’t find when it throws an exception, copying that DLL in and re-running it until you don’t get any more exceptions.
There are 2 ways of making the assemblies available to your program. You can either register them in the GAC so that they can be accessed from anywhere (I’ve not tried this and I probably wouldn’t recommend it – if you want to know how to do this, google installing an assembly in the GAC), or you can just copy them into the application folder that your EXE sits in (or bin folder on your ASP.NET website will probably work too). This does make for a lot of files in that folder, but it works!
You should be able to find the .NET 3.5 assemblies in a folder on a PC that has .NET 3.5 installed under
Program Files\Reference Assemblies\Microsoft\Framework\v3.5
nb. Make sure that you have Windows 2000 SP4 and .NET framework 2.0 SP1 installed on the Windows 2000 PC! You might also need to install KB 835732 before .NET 2.0 SP1.
No related posts.
Tags: .NET, .NET 3.5, .NET 3.5 SP1, .NET Framework, 2000, Coding, Dodgy, VB.NET, Windows, Windows 2000, Workarounds












Hello ~~
My windows 2000 server had been installed SP4 and .NET 2.0 SP1,
but not install KB 835732. If i install KB 835732 right now, could my windows 2000 server run .NET 3.5 program ?? Such as Linq to SQL,
Linq Expreesion so on.
Thank you very much.
It might work now! You can try it without installing the KB. You’ll just need to copy over any of the .NET 3.5 Framework DLL files into the application’s folder that it needs. It should work fine with Linq to SQL – I use that a lot on Windows 2000.
Hello ~~
I did asp.net 3.5 program in windows 2000 server and got problems.
My windows 2000 server had asp.net 2.0 web site to execute,
i developed new programs with .net 3.5 and use linq expression
and linq to sql.
First i copy C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5 all dlls to my asp.net 2.0 web site bin folder.
Second i compile my new asp.net 3.5 programs to asp.net 2.0
web site bin folder. I modified web.config of asp.net 2.0 web site to use
3.5 version. When i run new programs and show
“Can not find the compiler executable file csc.exe” error message.
Is my steps incorrect?
Could you teach me how to resolve this error?
I’m so sorry to bother you, because i don’t seach answer on google.
Thank you very much.
Hi,
I have the same problem, did you find any solution?
Thank you very much.
I haven’t actually tried this with ASP.NET – I’ve just been using Windows Forms. I suspect that the problem is that ASP.NET itself can’t find the v3.5 C# compiler when it is trying to build the site. I’m not sure how to fix this, but you could possibly work around it by encapsulating the 3.5 functionality inside a precompiled DLL file in your web site’s bin folder and call it from the rest of the site.
Another option might be to make a precompiled site, but I don’t really know that much about that.
Great article. I was wondering if something like this was possible and, sure enough, you pointed me in the right direction.
The web server I have to work with on this project is Win2k with .Net 2. .Net 3.5 won’t install on Win2k.
For those having trouble here is what I did and it worked like a charm.
Set my build target for the web app in Visual Studio 2008 to .Net 2.0. I like this better because then VS 2008 can tell me about missing references rather than waiting for the app to break on the server.
This instantly removed some references such as LINQ.
Did a build and received numerous errors, most pertaining to my code that made use of LINQ.
Put the System.core.dll and Linq.Data.dlls in my web app and referenced them. The LINQ errors went away but it still didn’t understand my lambda expressions or my auto-properties. Of course, these are compiler issues, not referenced code. I could change the autoproperties back to normal properties but there is no lambda equivalent for .Net 2.0.
Moved all LINQ code into a separate project that targeted 3.5 (like wizzard’s suggestion). Removed this code from the web app and createda a reference to the new project.
Did a build. Everything built great.
Deployed to web server. Received the following error:
Could not load type ‘System.ComponentModel.INotifyPropertyChanging’ from assembly ‘System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
After some googling it turns out that INotifyPropertyChanging wasn’t introduced until .Net 2.0 SP1. Sure enough, our web server had 2.0 but no service packs.
Installed .Net 2.0 SP2 and everything worked great!
I hope that helps anyone else here.
Matt,
Thanks for the extra info and the inbound link!
Martin
[...] required .Net 3.5 dlls then this shoudl work. Doing a quick search on Google lead me to this great article. I was wondering if something like this was possible and, sure enough, it pointed me in the [...]
That was the only way i found in the world wide web ^^.
I installed Windows2000-KB835732-x86-DEU.EXE , and after that i tried to install NetFx20SP1_x86.exe like u said.
but then i get error : “HeapSetInformation” wasn t found in the DLL file “KERNEL32.dll .
Now i don t know what to do ^^
Did you get the WCF on the client side working using this method. Whenever I create the new client base object I get an error. I have copied every dll from the Reference Assemblies folder mentioned above, both the 3.0 and 3.5.
The type initializer for ‘System.ServiceModel.DiagnosticUtility’ threw an exception.
at System.ServiceModel.DiagnosticUtility.get_ShouldUseActivity()
at System.ServiceModel.Channels.CommunicationObject.set_TraceOpenAndClose(Boolean value)
at System.ServiceModel.ChannelFactory..ctor()
at System.ServiceModel.ChannelFactory`1..ctor(Type channelType)
at System.ServiceModel.ChannelFactory`1..ctor(Binding binding, EndpointAddress remoteAddress)
at System.ServiceModel.ClientBase`1..ctor(Binding binding, EndpointAddress remoteAddress)
at LBCUpdateBatchLogService.FileServiceClient..ctor(Binding binding, EndpointAddress remoteAddress)
I haven’t actually tried it with WCF. If you get it working then please post up details here!
Thanks
Hi. I resolved how use WCF on windows 2000 server.
First follow the guide to install net 3.5 on windows 2000.
Second install Windows 2000 Service Pack 3 o 4 (the last service pack requires install SP4 Update Roll up too)
Third, install Net Framework 2.0 SP2 (requires Windows Installer 3.1)
Ok, copy all assemblies on the app folder. additionally you have to copy the next dll’s. I create a batch file to copy this dlls because explorer dont browse it.
copy C:\WINDOWS\assembly\GAC_MSIL\System.IdentityModel\3.0.0.0__b77a5c561934e089\System.IdentityModel.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\system.identitymodel.resources\3.0.0.0_es_b77a5c561934e089\System.IdentityModel.Resources.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.IdentityModel.Selectors\3.0.0.0__b77a5c561934e089\System.IdentityModel.Selectors.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\system.identitymodel.selectors.resources\3.0.0.0_es_b77a5c561934e089\System.IdentityModel.Selectors.Resources.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel.Install\3.0.0.0__b77a5c561934e089\System.ServiceModel.Install.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\system.servicemodel.install.resources\3.0.0.0_es_b77a5c561934e089\System.ServiceModel.Install.Resources.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\system.servicemodel.resources\3.0.0.0_es_b77a5c561934e089\System.ServiceModel.Resources.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel.WasHosting\3.0.0.0__b77a5c561934e089\System.ServiceModel.WasHosting.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel.Web\3.5.0.0__31bf3856ad364e35\System.ServiceModel.Web.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel.Web.resources\3.5.0.0_es_31bf3856ad364e35\System.ServiceModel.Web.resources.dll c:\temp
Finally, how the machine.config on the windows 2000 don’t know about wcf configuration, I manually add the sections configuration than I needed to my app configuration.
Finally my app runs ok!!!!
this is my app.config
I remove the brackets to show on this blog.
[?xml version="1.0" encoding="utf-8" ?]
[configuration]
[configSections]
[sectionGroup name="system.serviceModel" type="System.ServiceModel.Configuration.ServiceModelSectionGroup, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"]
[section name="behaviors" type="System.ServiceModel.Configuration.BehaviorsSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="bindings" type="System.ServiceModel.Configuration.BindingsSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="client" type="System.ServiceModel.Configuration.ClientSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="comContracts" type="System.ServiceModel.Configuration.ComContractsSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="commonBehaviors" type="System.ServiceModel.Configuration.CommonBehaviorsSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="diagnostics" type="System.ServiceModel.Configuration.DiagnosticSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="extensions" type="System.ServiceModel.Configuration.ExtensionsSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="machineSettings" type="System.ServiceModel.Configuration.MachineSettingsSection, SMDiagnostics, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="serviceHostingEnvironment" type="System.ServiceModel.Configuration.ServiceHostingEnvironmentSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="services" type="System.ServiceModel.Configuration.ServicesSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[/sectionGroup]
[sectionGroup name="system.runtime.serialization" type="System.Runtime.Serialization.Configuration.SerializationSectionGroup, System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"]
[section name="dataContractSerializer" type="System.Runtime.Serialization.Configuration.DataContractSerializerSection, System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[/sectionGroup]
[sectionGroup name="system.serviceModel.activation" type="System.ServiceModel.Activation.Configuration.ServiceModelActivationSectionGroup, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"]
[section name="diagnostics" type="System.ServiceModel.Activation.Configuration.DiagnosticSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="net.pipe" type="System.ServiceModel.Activation.Configuration.NetPipeSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[section name="net.tcp" type="System.ServiceModel.Activation.Configuration.NetTcpSection, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /]
[/sectionGroup]
[/configSections]
[system.serviceModel]
[extensions]
[behaviorExtensions]
[add name="webHttp" type="System.ServiceModel.Configuration.WebHttpElement, System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /]
[/behaviorExtensions]
[bindingElementExtensions]
[add name="webMessageEncoding" type="System.ServiceModel.Configuration.WebMessageEncodingElement, System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /]
[/bindingElementExtensions]
[bindingExtensions]
[add name="webHttpBinding" type="System.ServiceModel.Configuration.WebHttpBindingCollectionElement, System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /]
[/bindingExtensions]
[/extensions]
[bindings]
[wsHttpBinding]
[binding name="WSHttpBinding_ISSO_Svc" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false"]
[readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" /]
[reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" /]
[security mode="None"]
[transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" /]
[message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" /]
[/security]
[/binding]
[/wsHttpBinding]
[/bindings]
[client]
[endpoint address="http://10.255.255.171:3629/SSO_Svc.svc" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ISSO_Svc" contract="SSOSVC.ISSO_Svc"
name="WSHttpBinding_ISSO_Svc"]
[identity]
[dns value="localhost" /]
[/identity]
[/endpoint]
[/client]
[/system.serviceModel]
[/configuration]
You can need this assemblies
copy C:\WINDOWS\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll c:\temp
copy C:\WINDOWS\assembly\GAC_MSIL\System.Core.resources\3.5.0.0_es_b77a5c561934e089\System.Core.Resources.dll c:\temp
Thanks for all this, Carlos – I’m sure people will find it useful!