Finns det något jag missat, dvs ett annat sätta att slå på Option Strict för webbapplikationer med vb.net som språk och då särkilt om man använder ramverket 3.5? Eftersom ingen (vad jag hittade) hade någon lösning på Option Strict (* än tidigare beskrivna kb: artikel) tog jag kontakt med Scott Guthrie.Option Strict On - Asp.NET 3.5 (för Vb.Net)
Väljer att skriva om mina erfarenheter i berättelseform nedan
<b>Sätta Option Strict On som Default för projekt</b>
msdn2.microsoft.com/en-us/library/t0k7484c.aspx
- fungerar dock fortfarande INTE för webbapplikationer
<b>2.0 och 3.5 Ändra värde i Web.Config</b>
- fungerar inte
<compilation debug="false" strict="true" explicit="true">
- Fungerar inte alls....
Vad gör egentligen strict="true" här??...
inget för klasser i App_Code, inget för codebehind, och inget vid kompilering
Testa själva!
<b>2.0 och 3.5 slå på det i i varje klassfil </b>
- fungerar....
Option Strict On
<b>Börjar att undersöka web.config för 3.5...</b>
Bra genomgång av Web.Config för 3.5
www.4guysfromrolla.com/articles/121207-1.aspx
<b>3.5 default web.config</b>
Utdrag från .Config-filen
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4"
type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="true"/>
</compiler>
</compilers>
</system.codedom>
Testar att ändra denna med att intuitivt lägga till ett element.
<b>3.5 - Modifierad med ditlagd provideroption </b>
- fungerar inte
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4"
type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<!--Testar-->
<providerOption name="OptionStrict" value="true"/>
<providerOption name="WarnAsError" value="true"/>
</compiler>
<b>2.0 web.config lösning </b>
-fungerar för både codebehind och App_Code filer
beskriven på support.microsoft.com/kb/911793
<configuration>
<system.codedom>
<compilers>
<compiler compilerOptions ="/optionexplicit+ /optionstrict+" language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</compilers>
</system.codedom>
...
<b>Försök 3.5 Använd befintlig 2.0 fungerande lösning </b>
- Fungerar till slut ( i codebehind och App_Code )
Fungerar dock inte rakt av...
då det redan finns en system.codedom
(Se 3.5 default web.config ovan)
<b>Lösning:</b>
- Ta bort/kommentera bort vb-delen
( och c# delen med om inte några sådana klasser kommer att användas...)
- lägg till gamla lösningen
- lägg till compiler providerOption för option Infer och Compilerversion för att möjliggöra 3.5 och dess features ( bla option infer)
Slutresultat Web.Config
<system.codedom>
<compilers>
<compiler compilerOptions ="/optionexplicit+ /optionstrict+" language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<!--kopiera och klistra in-->
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="true"/>
</compiler>
</compilers>
</system.codedom>
<b>Funderingar</b>
Varför fungerar nu detta?
Försökte hitta dokumentation om möjliga värden till providerOption på MSDN
msdn2.microsoft.com/en-us/library/bb397730.aspx
Tji fick jag, där står att man kan ange värden.. (nehe!?)
VILKA värden kan man sätta?
Det intuitiva försöket enligt tidigare ville det sig inte med att skriva <providerOption name="OptionStrict" value="true"/>
(testade btw att gå emot mönstret och skriva med små bokstäver, det gick inte det heller)
Nu börjar jag då undra, varför verkar det gå med lösningen för 2.0 men inte med <providerOption> ?
Antingen skriver jag fel värden
(jag vet ju fortfarande inte vilka som finns då den dokumentationen är svår att hitta alt. inte finns)
...
eller så är det något annat som spökar.
2.0 lösningen verkar direktskicka in sina parametrar till kompilatorn vbc.exe
Tittar därför på dokumentation om parametrar på http://msdn2.microsoft.com/en-us/library/s4kbxexc.aspx
Hittar värdena på msdn2.microsoft.com/en-us/library/ayaf8c2k.aspx
Dokumentationen säger att kompilatorn tar just "optionstrict+" för på och "optionstrict-" för av.
Eftersom sökningen på MSDN och google gick dåligt för möjliga värden för <providerOption> vände jag mig till att titta under huven istället mha kära Reflector.
Jag fann nedanstående!
Det verkar som att det inte finns några mer? <providerOption> än de som finns i web.config per default; man kan alltså inte gå den vägen för att slå på option strict alls!!!
(rätta mig mer än gärna om jag har fel)
Private Shared Sub ProcessProviderOptions(ByVal codeDomProviderType As Type, ByVal compilParams As CompilerParameters)
Dim providerOptions As IDictionary(Of String, String) = CompilationUtil.GetProviderOptions(codeDomProviderType)
If (Not providerOptions Is Nothing) Then
If ((codeDomProviderType Is GetType(VBCodeProvider)) OrElse (codeDomProviderType Is GetType(CSharpCodeProvider))) Then
AssemblyBuilder.ProcessBooleanProviderOption("WarnAsError", "/warnaserror+", "/warnaserror-", providerOptions, compilParams)
End If
If (((Not codeDomProviderType Is Nothing) AndAlso CompilationUtil.IsCompilerVersion35(codeDomProviderType)) AndAlso (codeDomProviderType Is GetType(VBCodeProvider))) Then
AssemblyBuilder.ProcessBooleanProviderOption("OptionInfer", "/optionInfer+", "/optionInfer-", providerOptions, compilParams)
End If
End If
End Sub
Visual studio och hanteringen av Option Strict On, läser på något sätt ut argumenten i web.config till kompilatorn, och går in i ett annat läge och kan på det sättet varna mig som utvecklare
(precis som om jag slagit på Option Strict On i början av koddokumentet)
tex om jag försöker göra fulkonverteringar mellan datatyper; tex mellan sträng --till--> integer.
Vore det inte bättre om någon av följande scenarion fungerade istället.
1) <compilation debug="false" strict="true" explicit="true"> - fungerar rakt av
2) Project Default inställningen i Visual studios påverkade VS interna tillstånd om hur kontrollera kod
3) <providerOption> hade möjlighet att ange OptionStrict
och om 3
3b) Att denna då infogades från mallfil när projektet / web.config skapades på samma sätt som information läggs till när man byter target framework
(från de Visual studio fil / projektmallar som finns)
<b>Någon som har en alternativ lösning för 3.5 webbaplikationer med Vb.Net som språk?</b>
Sv: Option Strict On - Asp.NET 3.5 (för Vb.Net) -svar från Scott
Man får hoppas att det kommer någon lösning längre fram... kanske vs2008++ ;)
-------------
Hi Jon,
Thanks for the feedback. I'm looping in Omar who runs the Web Tools team to see it as well.
Thanks,
Scott
-------------
Hi Jon,
This is a good suggestion. Our hotfix process is quite costly to the team, so we typically are only able to prioritize critical issues with no easy workarounds for hotfix updates.
However, we do value good suggestions like this, so we definitely will consider it for a future release of VS.
I'm passing it along to Vishal, who owns this specific area of the product.
Thanks,
--Omar