[C++/CLI]Problemen met deployen *

Pagina: 1
Acties:

Onderwerpen


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
Ik heb een simpele applicatie gemaakt in Visual Studio Express, de app is op basis van Visual C++ CLR Windows forms project.
Het programma functioneert goed en naar verwachting op mijn PC. Omdat het op ander PC's moet draaien ben ik overgestapt naar VS2008 Trial editie, nu kan ik makkelijker een setup bestand kan maken met de nodige checks naar dependencies.

Het probleem:

Een VS2008 applicatie van het gekozen type wordt (blijkbaar) voor .Net Framework 3.5 gemaakt. Op de target PC's is over het algemeen .NET 2.0 aanwezig en die wil ik niet belasten met de mijns inziens onnodige installatie (de applicatie leest en analyseert een tekstbestand) van .NET 3.5.
Onder de project properties kan ik het "Targeted Framework" kiezen; dus keuze voor 2.0 lijkt me erg logisch voor het probleem...
Nu crasht de applicatie meteen als het gestart wordt en dat is wat ik niet snap!

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 12:30
Krijg je een melding als je applicatie crasht? Zo ja, welke? (kijk eventueel in de event viewer). Als je de applicatie debugged op 2.0 framework, werkt dan alles? Maak je geen gebruik van dingen die in .NET 2.0 niet ondersteund zijn?

Specs


  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Jou eigen PC heeft wel .NET 2.0?

Freelance Unity3D developer


  • beany
  • Registratie: Juni 2001
  • Laatst online: 12:49

beany

Meeheheheheh

Als visual studio 2008 geinstalleerd is, is er zelfs .net 3.5 geinstalleerd. Heeft hij de SP1 voor VS2008 gedraaid dan staat het .net 3.5sp1 framework op zijn pc.
Nu crasht de applicatie meteen als het gestart wordt en dat is wat ik niet snap!
Waar gestart? Je start de release versie buiten VS om? Of de debug versie vanuit VS ?

[ Voor 22% gewijzigd door beany op 12-02-2009 11:04 ]

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als hij het wel doet onder .NET 3.5 dan moet hij wel .NET 2.0 hebben aangezien .NET 3.0 en 3.5 geen eigen runtime hebben, maar gewoon op .NET 2.0 draaien.

Hoezo ben je overgestapt op een Trial editie? Je kan gewoon de gratis Express edities downloaden.

En wat gaat er mis tijdens het crashen? Probeer eens te debuggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Haan

dotnetter

Ik heb ook wel eens moeite gehad met de .Net versie goed te krijgen bij een setup project in VS 2008. Er zit ergens op een onlogisch plek een propertie die nog naar 3.5 blijft verwijzen, terwijl je op een andere plek al hebt aangegeven dat je versie 2.0 wilt gebruiken.
Maar volgens mij is dat je probleem ook niet, dan zou je alleen een installer krijgen die steeds het 3.5 framework wil installeren.
Kijk inderdaad eerst eens wat er in de eventvwr komt te staan.

offtopic:
overigens is je titel haast een pleonasme hè ;)

Kater? Eerst water, de rest komt later


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
decoy schreef op donderdag 12 februari 2009 @ 10:28:
Ik heb een simpele applicatie gemaakt in Visual Studio Express, de app is op basis van Visual C++ CLR Windows forms project.
Doe je nu C++ of C#? Verder kun je in VS2005 gewoon een deploy doen en dan krijg je een ClickOnce installer, deze kun je instellen als Web-installer of als gewone standaard installer. Dit werkt dan meestal prima op andere pc's (soms kan hij sommige depdencies zoals apparte frameworks (XNA) niet vinden, maar voor gewone C# /C++ apps gaat dit in 1x goed en hij verwijst zelfs naar de website van .Net2.0 als je die nog niet hebt.

Meer info: http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx

~ Mijn prog blog!


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
asfaloth_arwen schreef op donderdag 12 februari 2009 @ 10:35:
Krijg je een melding als je applicatie crasht? Zo ja, welke? (kijk eventueel in de event viewer). Als je de applicatie debugged op 2.0 framework, werkt dan alles? Maak je geen gebruik van dingen die in .NET 2.0 niet ondersteund zijn?
De event viewer geeft een .NET Runtime 2.0 Error.
Ik heb de applicatie oa gemaakt voor .NET 2.0 en op eigen PC draait het dan goed.
Op het gebied van dingen die ik gebruik en wel of niet door versie ... wordt ondersteund ben ik een leek. Het is een simpel form met wat textboxjes en labels.
Ik open een tekstbestandje als een StreamReader. Lees regels in met LineRead() en gebruik Convert::ToString() en Convert::ToInt32() om eea te analyseren. Lijkt me niet schokkend of specifiek voor .NET 3.5
beany schreef op donderdag 12 februari 2009 @ 11:03:
Waar gestart? Je start de release versie buiten VS om? Of de debug versie vanuit VS ?
Op de target PC met .NET 2.0 framework. en vcredist_x86 zonder VS.
Woy schreef op donderdag 12 februari 2009 @ 11:05:
[...]
Hoezo ben je overgestapt op een Trial editie? Je kan gewoon de gratis Express edities downloaden.

En wat gaat er mis tijdens het crashen? Probeer eens te debuggen.
Er gaan mensen met de applicatie om die geen kaas hebben gegeten van software e.d., met de trial editie kan ik een installer maken met de juiste dependencies.
Debuggen gaat niet, er staat geen VS op de target. Op eigen PC draait het prima.


De event viewer geeft nu interessante info, maar ik begrijp het nog steeds niet. :?

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 12:30
decoy schreef op donderdag 12 februari 2009 @ 11:23:
[...]
De event viewer geeft een .NET Runtime 2.0 Error.

*knip*

De event viewer geeft nu interessante info, maar ik begrijp het nog steeds niet. :?
Post even de volledige entry uit je event log?

Specs


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
asfaloth_arwen schreef op donderdag 12 februari 2009 @ 11:27:
[...]

Post even de volledige entry uit je event log?
Ja, ik neem aan dat je dit bedoeld:

Faulting application datalogreader.exe, version 0.0.0.0, 
stamp 4993cf60, faulting module kernel32.dll, version 5.1.2600.5512, 
stamp 48038e0d, debug? 0, fault address 0x00012aeb.

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 12:30
Event ID en Source zijn ook handig. Verder lijkt me dit echt gewoon debug werk*.Weet je zeker dat op die pc .NET 2.0 geinstalleerd is?

*je leest een textfile in, stel dat geeft om een of andere reden een exceptie (FileNotFound oid), weet je zeker dat deze opgevangen wordt en juist afgehandeld?

[ Voor 39% gewijzigd door asfaloth_arwen op 12-02-2009 11:59 ]

Specs


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
asfaloth_arwen schreef op donderdag 12 februari 2009 @ 11:56:
Event ID en Source zijn ook handig. Verder lijkt me dit echt gewoon debug werk*.Weet je zeker dat op die pc .NET 2.0 geinstalleerd is?

*je leest een textfile in, stel dat geeft om een of andere reden een exceptie (FileNotFound oid), weet je zeker dat deze opgevangen wordt en juist afgehandeld?
Event ID: 1000.

De PC heeft de volgende .NET geïnstalleerd:
  • 1.1
  • 1.1 dutch language pack
  • 1.1 hotfix
  • 2.0 language pack NLD
  • 2.0 SP2
  • En inmiddels ook:
  • 3.0 NLD
  • 3.0 SP2
  • 3.5 SP1
Zonder .NET 3.5 (3.0 weet ik niet zeker van of het er al op stond) crasht de applicatie meteen bij opstarten.
Ik handel (nog) geen excepties af, maar de file wordt pas geopend nadat hier expliciet voor gekozen is.
Met .NET3.5 op dezelfde PC werkt het programma wel, de debug stelling begrijp ik dus niet.

Zie voor de volledigheid de code hieronder.

C++: form1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
#include "stdafx.h"
#include "Form1.h"
#include "AboutBox.h"
#include "data.h"


#include <stdlib.h> 


using namespace DataLogReader;  // Form1
using namespace System::IO;     // stream


//----------------------------------------------------------------------------------------

Form1::Form1(void)
{
    InitializeComponent();

    // init text of radio buttons
    Form1::radioButtonExportEvery->Text = 
        "Export every " + Form1::numericUpDownExportEvery->Value + "th cycle";

    Form1::radioButtonExportFirstLast->Text = 
        "Export first and last " + Form1::numericUpDownExportFirstLast->Value + "th cycles";

    // init radiobutton value
    Form1::radioButtonExportEvery->Checked = true;
}
//----------------------------------------------------------------------------------------


Form1::~Form1()
{
    if (components)
    {
        delete components;
    }
}
//----------------------------------------------------------------------------------------

System::Void Form1::exitToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)
{
    Application::Exit();
}
//----------------------------------------------------------------------------------------

System::Void Form1::aboutToolStripMenuItem_Click(System::Object ^sender, System::EventArgs ^e)
{
    AboutBox^ aboutBox = gcnew AboutBox();
    aboutBox->ShowDialog();
}
//----------------------------------------------------------------------------------------

System::Void Form1::openToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)
{
    __int64 NrOfLines = 0;
    __int64 NrOfSystemMessages = 0;
    __int64 NrOfDataMessages = 0;
    
    __int64 Cycles = 0;
    __int32 TemperatureRequest = 0;
    __int32 VolumeRequest = 0;
    
    __int64 Resets = 0;
    __int32 SoftwareVersion = 0;

    __int64 Errors = 0;
    __int64 ErrNtcInletShort = 0;
    __int64 ErrNtcOutletOpen = 0;
    __int64 ErrNtcInletOpen = 0;
    __int64 ErrNtcOutletShort = 0;
    __int64 ErrHeatingElementOpen = 0;
    __int64 ErrEFastOpen = 0;
    __int64 ErrRelaisMalFunction = 0;
    __int64 ErrTempInletToHigh = 0;
    __int64 ErrTempOutletToHigh = 0;
    __int64 ErrEFastShortTherm = 0;
    __int64 ErrEFastLongTherm = 0;
    __int64 ErrNoDrawer = 0;
    __int64 ErrNoWater = 0;
    
    
    
    OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
    
    // set file reading preferences
    openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    openFileDialog1->FilterIndex = 1;
    openFileDialog1->RestoreDirectory = true;
    
    // show file open dialog
    if (openFileDialog1->ShowDialog() == ::DialogResult::OK )
    {
        StreamReader^ streamReader;
        
        
        // store the name for export function
        StrInputFileName = openFileDialog1->FileName;
        
        // open the file as a stream
        streamReader = File::OpenText(openFileDialog1->FileName);
        try
        {
            String^ LineRead = "";

            while ( LineRead = streamReader->ReadLine() )
            {
                // count the number of lines in the file
                NrOfLines++;
                
                
                // examine the line length, this tells the kind of data
                if (LineRead->Length == 21)
                {
                    // get a substring with message type
                    // and message value
                    String^ StrMessageType = LineRead->Substring(9, 2);
                    String^ StrMessageValue = LineRead->Substring(12, 9);
                    unsigned int MessageValue = Convert::ToInt32(StrMessageValue);

                    // count system messages
                    NrOfSystemMessages++;
                    
                    // examine messages contents
                    // type of message
                    switch (Convert::ToInt32(StrMessageType))
                    {
                        case 1://" 1":
                            // count the number of times the version number is received
                            // this indicates a hard or software reset
                            Resets ++;

                            // get the version number of the software
                            SoftwareVersion = MessageValue;
                        break;

                        case 6://" 6":
                        case 5:
                            // count the number of errors
                            Errors ++;

                            if (MessageValue & nErrNtcInletShort)
                                ErrNtcInletShort++;
                            if (MessageValue & nErrNtcOutletOpen)
                                ErrNtcOutletOpen++;
                            if (MessageValue & nErrNtcInletOpen)
                                ErrNtcInletOpen++;
                            if (MessageValue & nErrNtcOutletShort)
                                ErrNtcOutletShort++;
                            if (MessageValue & nErrHeatingElementOpen)
                                ErrHeatingElementOpen++;
                            if (MessageValue & nErrEFastOpen)
                                ErrEFastOpen++;
                            if (MessageValue & nErrRelaisMalFunction)
                                ErrRelaisMalFunction++;
                            if (MessageValue & nErrTempInletToHigh)
                                ErrTempInletToHigh++;
                            if (MessageValue & nErrTempOutletToHigh)
                                ErrTempOutletToHigh++;
                            if (MessageValue & nErrEFastShortTherm)
                                ErrEFastShortTherm++;
                            if (MessageValue & nErrEFastLongTherm)
                                ErrEFastLongTherm++;
                            if (MessageValue & nErrNoDrawer)
                                ErrNoDrawer++;
                            if (MessageValue & nErrNoWater)
                                ErrNoWater++;
                        break;
                    }
                }
                else
                if (LineRead->Length == 71) // log messages
                {
                    // Determine if a new cycle has started
                    // To do so the actual volume will be checked,
                    // when it changes from a high to a low actual volume
                    // we have a count.
                    
                    // start with a high value for the first cycle;
                    static __int32 ActualVolume = 240;
                    __int32 NewVolume = Convert::ToInt32(LineRead->Substring(48, 5));

                    if (ActualVolume > NewVolume)
                    {
                        Cycles++;
                    }
                    // remember last volume
                    ActualVolume = NewVolume;

                    // get set volume and set temperature
                    TemperatureRequest = Convert::ToInt32(LineRead->Substring(18, 5));
                    VolumeRequest = Convert::ToInt32(LineRead->Substring(42, 5));
                    
                    // count log messages
                    NrOfDataMessages++;
                }
            }

            // The while is finnished,
            // Fill the textBoxes with data

            // File info
            textBoxNrOfLines->Text = Convert::ToString(NrOfLines);
            textBoxNrOfSystemMessages->Text = Convert::ToString(NrOfSystemMessages);
            textBoxNrOfDataMessages->Text = Convert::ToString(NrOfDataMessages);
            
            // cycle info
            textBoxCycles->Text = Convert::ToString(Cycles);
            textBoxTemperatureRequest->Text = Convert::ToString(TemperatureRequest);
            textBoxVolumeRequest->Text = Convert::ToString(VolumeRequest);
            
            // reset info
            textBoxResets->Text = Convert::ToString(Resets);
            textBoxSoftwareVersion->Text = Convert::ToString((SoftwareVersion >> 24) & 0xFF) + "." +
                                           Convert::ToString((SoftwareVersion >> 16) & 0xFF) + "." +
                                           Convert::ToString((SoftwareVersion >> 8) & 0xFF) + "." +
                                           Convert::ToString((SoftwareVersion) & 0xFF);

            
            // error info
            textBoxErrors->Text = Convert::ToString(Errors);
            textBoxErrNtcInletShort->Text = Convert::ToString(ErrNtcInletShort);
            textBoxErrNtcOutletOpen->Text = Convert::ToString(ErrNtcOutletOpen);
            textBoxErrNtcInletOpen->Text = Convert::ToString(ErrNtcInletOpen);
            textBoxErrNtcOutletShort->Text = Convert::ToString(ErrNtcOutletShort);
            textBoxErrHeatingElementOpen->Text = Convert::ToString(ErrHeatingElementOpen);
            textBoxErrEFastOpen->Text = Convert::ToString(ErrEFastOpen);
            textBoxErrRelaisMalFunction->Text = Convert::ToString(ErrRelaisMalFunction);
            textBoxErrTempInletToHigh->Text = Convert::ToString(ErrTempInletToHigh);
            textBoxErrTempOutletToHigh->Text = Convert::ToString(ErrTempOutletToHigh);
            textBoxErrEFastShortTherm->Text = Convert::ToString(ErrEFastShortTherm);
            textBoxErrEFastLongTherm->Text = Convert::ToString(ErrEFastLongTherm);
            textBoxErrNoDrawer->Text = Convert::ToString(ErrNoDrawer);
            textBoxErrNoWater->Text = Convert::ToString(ErrNoWater);
        }
        finally
        {
            if ( streamReader )
                delete (IDisposable^)(streamReader);
        }
    }
}
//----------------------------------------------------------------------------------------


System::Void Form1::numericUpDownExportEvery_ValueChanged(System::Object^  sender, System::EventArgs^  e)
{
    Form1::radioButtonExportEvery->Text = "Export every " +
                                          Form1::numericUpDownExportEvery->Value +
                                          "th cycle";
}
//----------------------------------------------------------------------------------------

System::Void Form1::numericUpDownExportFirstLast_ValueChanged(System::Object^  sender, System::EventArgs^  e)
{
    Form1::radioButtonExportFirstLast->Text = "Export first and last " +
                                               Form1::numericUpDownExportFirstLast->Value +
                                               "th cycles";
}
//----------------------------------------------------------------------------------------


System::Void Form1::buttonExport_Click(System::Object^  sender, System::EventArgs^  e){

    SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
    
    // set file saving preferences
    saveFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    saveFileDialog1->FilterIndex = 1;
    saveFileDialog1->RestoreDirectory = true;

    // show file open dialog
    if (saveFileDialog1->ShowDialog() == ::DialogResult::OK ) {
        StreamReader^ streamReader;

        //open file for reading
        if (File::Exists(StrInputFileName)){
            StreamWriter^ streamWriter;
    
            // file is existing
            streamReader = File::OpenText(StrInputFileName);
            
            // create file for writing
            streamWriter = File::CreateText(saveFileDialog1->FileName);
            
            // copy file
            try {
                // Determine if a new cycle has started
                // To do so the actual volume will be checked,
                // when it changes from a high to a low actual volume
                // we have a count.

                // The line bust be 71 chars long to be a log data line
                // ActualVolume = 240 makes counting first cycle.
                String^ LineRead = "";
                static __int32 ActualVolume = 240;
                __int32 Cycles = 0;
                
                // read a line
                while (LineRead = streamReader->ReadLine()) {
                    if (LineRead->Length == 71) { // log messages
                        
                        // start with a high value for the first cycle;
                        __int32 NewVolume = Convert::ToInt32(LineRead->Substring(48, 5));
                        
                        // test for a new cycle
                        if (ActualVolume > NewVolume)
                        {
                            Cycles++;
                        }
                        ActualVolume = NewVolume;

                        // test if the cycle fits in the export requirements
                        if (((radioButtonExportEvery->Checked && (Cycles % numericUpDownExportEvery->Value) == 0)) ||
                             (radioButtonExportFirstLast->Checked && 
                              (Cycles <= numericUpDownExportFirstLast->Value || 
                               Cycles >= (Convert::ToInt64(textBoxCycles->Text) - numericUpDownExportFirstLast->Value))))
                        {
                            streamWriter->WriteLine(LineRead);
                        }
                    }
                    else { // system message
                        // copy it
                        streamWriter->WriteLine(LineRead);
                    }

                }
            }
            finally {
                if (streamReader)
                    delete (IDisposable^)(streamReader);
                if (streamWriter)
                    delete (IDisposable^)(streamWriter);
            }
        }
    }
}

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
decoy schreef op donderdag 12 februari 2009 @ 11:23:
[...]
Er gaan mensen met de applicatie om die geen kaas hebben gegeten van software e.d., met de trial editie kan ik een installer maken met de juiste dependencies.
Debuggen gaat niet, er staat geen VS op de target. Op eigen PC draait het prima.
Kan je serieus geen installer maken met de Express versie? Dat wist ik niet.

Ik zie inderdaad dat je alleen een click_once installer kunt maken met de express editie.

Maar waarschijnlijk heeft je probleem niet met de installer te maken. Probeer het gewoon eens met de hand te installeren ( AKA gewoon kopieren ) en dan kijken of het wel goed gaat. Zorg ook dat je in je applicatie alle exceptions afvangt ( en ook logt natuurlijk, anders heb je er nog niks aan ). ( AppDomain.CurrentDomain.UnhandledException )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
roy-t schreef op donderdag 12 februari 2009 @ 11:17:
[...]


Doe je nu C++ of C#? Verder kun je in VS2005 gewoon een deploy doen en dan krijg je een ClickOnce installer, deze kun je instellen als Web-installer of als gewone standaard installer. Dit werkt dan meestal prima op andere pc's (soms kan hij sommige depdencies zoals apparte frameworks (XNA) niet vinden, maar voor gewone C# /C++ apps gaat dit in 1x goed en hij verwijst zelfs naar de website van .Net2.0 als je die nog niet hebt.

Meer info: http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx
Geen idee of ik C++ of C# doe, volgens mij zit alles door elkaar >:)
Ik heb een aantal functies ontdekt die bij C# horen en die lekker snel zijn.

Vanuit de Express versie was het voor mij teveel geklooi om te deployen, dat is de reden dat ik nu VS2008 Trial gebruik. Mogelijk gaan we VS2008 standard editie kopen voor dit soort simpele appjes of ga ik gewoon weer naar de Borland Turbo C++ editie en iets meer gekunstel om eea voor elkaar te krijgen.

Ik programmeer op embedded 8 bitters en de duurtest applicaties genereren bakken met data die verwerkt moeten worden, dus ik maak zonder veel kennis van zaken "iets" op windows tot het werkt en zet het dan op PC's die die data verzamelen of bij mensen die dit onderzoeken.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Mischien kun je je code wat inkorten tot het stukje wat problemen oplevert? Ik denk niet dat er mensen zin hebben om alles te doorlopen.

Het is wel appart dat je niet weet of je C++ of C# doet. De code die je geplaatst hebt is ieder geval C++/CLI.

Verder zijn er nog wel andere opties om Installers te maken. Voor de wat uitgebreidere dingen kun je eens naar WIX kijken ( en de tools die er voor beschikbaar zijn ). Maar er zullen vast ook simpelere programma's zijn om installers te maken.

Echter zou ik eerst eens gewoon proberen je applicatie aan de gang te krijgen zonder installer, want ik heb het idee dat het niks met de installer te maken heeft.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
Woy schreef op donderdag 12 februari 2009 @ 12:34:
Mischien kun je je code wat inkorten tot het stukje wat problemen oplevert? Ik denk niet dat er mensen zin hebben om alles te doorlopen.

Het is wel appart dat je niet weet of je C++ of C# doet. De code die je geplaatst hebt is ieder geval C++/CLI.

Verder zijn er nog wel andere opties om Installers te maken. Voor de wat uitgebreidere dingen kun je eens naar WIX kijken ( en de tools die er voor beschikbaar zijn ). Maar er zullen vast ook simpelere programma's zijn om installers te maken.

Echter zou ik eerst eens gewoon proberen je applicatie aan de gang te krijgen zonder installer, want ik heb het idee dat het niks met de installer te maken heeft.
Ja apart hè :+ Sorry ik ben enigzins de draad kwijt door .NET dat ik automatisch koppel aan C# en of dat wel of niet klopt weet ik niet. Fijn dat het toch nog C++/CLI is :*)

Ik weet dat het niets met de installer te maken heeft, met de installer kan ik gewoon checken of de target PC voorzien is van de juiste dependencies en ze indien nodig installeren.

Het punt is dat ik niet weet waar in de code het fout gaat, het heeft naar mijn vermoeden zelfs niets met de code te maken, het enig wat wordt uitgevoerd als de app crasht is:
C++: DataLogReader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// DataLogReader.cpp : main project file.

#include "stdafx.h"
#include "Form1.h"

using namespace DataLogReader;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it
    Application::Run(gcnew Form1());
    return 0;
}


Ik gooi .NET 3.5 weer van de target af om het probleem weer te reproduceren en zal eens iets proberen met een lege app.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je .NET 3.5 dus wel geinstalleerd hebt dan doet hij het wel goed?

Weet je dan zeker dat je Compile Target wel .NET 2.0 is? En dat je toch niet ergens nog refferences hebt naar assemblies van het .NET 3.5 framework?
decoy schreef op donderdag 12 februari 2009 @ 12:54:
[...]
Het punt is dat ik niet weet waar in de code het fout gaat, het heeft naar mijn vermoeden zelfs niets met de code te maken, het enig wat wordt uitgevoerd als de app crasht is:
Dan zul je dus wat extra debugging code moeten toevoegen, en zeker weten dat je alle Exceptions afvangt.

[ Voor 47% gewijzigd door Woy op 12-02-2009 13:00 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
Woy schreef op donderdag 12 februari 2009 @ 12:58:
Als je .NET 3.5 dus wel geinstalleerd hebt dan doet hij het wel goed?

Weet je dan zeker dat je Compile Target wel .NET 2.0 is? En dat je toch niet ergens nog refferences hebt naar assemblies van het .NET 3.5 framework?


[...]

Dan zul je dus wat extra debugging code moeten toevoegen, en zeker weten dat je alle Exceptions afvangt.
Ja, met 3.5 doet ie het prima.
"Project->properties->Common properties->Framework and references->Targeted Framework" staat op .NET Framework 2.0. Ikzelf heb geen verwijzingen toegevoegd en ik mag aannemen dat de instelling global is, zoniet dan weet ik niet waar ik moet zoeken.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Aangezien hij het met 3.5 wel doet, heb je waarschijnlijk toch ergens een dependency naar een 3.5 Assembly.

Probeer eens een nieuw Windows Forms Application te maken en die gewoon te draaien. Dus voor de rest geen code toevoegen ( Wel even controleren of het Target Framework op 2.0 staat natuurlijk ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 12:30
With ^^. Eventueel al direct tijdens het aanmaken op 2.0 zetten, en dan je code in het nieuwe project kopieren en testen of het dan wel werkt.

[ Voor 12% gewijzigd door asfaloth_arwen op 12-02-2009 13:52 ]

Specs


  • Vincenz0
  • Registratie: Augustus 2006
  • Laatst online: 12-09 09:48

Vincenz0

Coder

Dit is logisch, als je een 3.5 project aanmaakt dan maakt hij standaard een reference naar de volgende .Net 3.5 DLL's:

System.Data.DataSetExtensions
System.Xml.Linq

Zelfs als je target framework vervolgens naar 2.0 zet gooit hij de references niet zomaar weg.

Ga naar de references van je project, delete deze 2 (staat als het goed is ook een uitroepteken bij!) en voila weg is je exception op de 2.0 computers.

Je schrijft btw c++ code voor het .net framework. dat is geen C#. maar ook absoluut _geen_ MFC C++.

Coding 4 Fun!


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
Met .NET 3.5 en ook 3.0 verwijderd blijft de applicatie het gewoon doen, heb al gezien dat er nogal wat restanten in het systeem achterblijven.
Ik heb wel een verse PC gevonden en daar .NET 2.0 op gezet, de app crash weer met een .NET runtime error.

Ik heb ook een nieuw project gestart, Visual C++/CLR.
Zonder iets aan de code te wijzigen en gericht op Framework 2.0 gebuild.
De app die gestart wordt heeft meteen een runtime error op .NET 2.0.

Op de PC waar .NET 3.0 t/m 3.5 heeft "gestaan" draait de app wel.

Schiet mij maar lek 8)7

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Heb je voor C++/CLI ook niet "Microsoft Visual C++ 2008 Redistributable Package" nodig op je PC?

Het kan overigens makkelijk zijn om dit soort zaken in een Virtual Machine te testen, hoef je niet telkens opnieuw te installeren :)

[ Voor 41% gewijzigd door Woy op 12-02-2009 14:11 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
Vincenz0 schreef op donderdag 12 februari 2009 @ 14:00:
Dit is logisch, als je een 3.5 project aanmaakt dan maakt hij standaard een reference naar de volgende .Net 3.5 DLL's:

System.Data.DataSetExtensions
System.Xml.Linq

Zelfs als je target framework vervolgens naar 2.0 zet gooit hij de references niet zomaar weg.

Ga naar de references van je project, delete deze 2 (staat als het goed is ook een uitroepteken bij!) en voila weg is je exception op de 2.0 computers.

Je schrijft btw c++ code voor het .net framework. dat is geen C#. maar ook absoluut _geen_ MFC C++.
Dat klonk hoopvol, maar de references zijn automatisch goed gezet door the Target Framework (gechecked). Okay C++ voor .NET dus, voor mij staan er iets te veel bomen in het bos, maar al doende leert men... ;)
Woy schreef op donderdag 12 februari 2009 @ 14:10:
Heb je voor C++/CLI ook niet "Microsoft Visual C++ 2008 Redistributable Package" nodig op je PC?

Het kan overigens makkelijk zijn om dit soort zaken in een Virtual Machine te testen, hoef je niet telkens opnieuw te installeren :)
"Microsoft Visual C++ 2008 Redistributable Package" heb je idd nodig en staat geïnstalleerd.
Met een VM ben ik bekend, ik dacht dat het een klein probleempje was, maar het kost me inmiddels al 2 dagen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:02
Je vergeet niet toevallig een Clean/Rebuild All te doen? Kan me voorstellen dat er (tijdelijke) bestanden achterblijven bij een switch naar een ander versie Framework?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
farlane schreef op donderdag 12 februari 2009 @ 15:04:
Je vergeet niet toevallig een Clean/Rebuild All te doen? Kan me voorstellen dat er (tijdelijke) bestanden achterblijven bij een switch naar een ander versie Framework?
Nope O-)

Acties:
  • 0 Henk 'm!

  • decoy
  • Registratie: November 1999
  • Laatst online: 13-01-2018
Ik ben er min of meer uit dankzij deze link. :9~

Komt wat mij betreft op neer dat je een C# project moet aanmaken die je op het gewenste .NET Framework target.
Over een VC++/CLR app targetten op .NET 2.0 heb ik helaas niets kunnen vinden, en of het überhaupt kan blijft voor mij een vraag.

Afijn, nieuwe ronde, nieuwe kansen. VC# ziet er qua mogelijkheden ook interessant uit :+

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Met C# is het inderdaad ook gewoon mogenlijk, maar ik geloof niet dat het niet mogenlijk is om je C++/CLI applicatie onder 2.0 aan de gang te krijgen.

3.0 en 3.5 applicaties draaien immers ook gewoon op het 2.0 framework, er zijn alleen wat extra libraries.

[ Voor 8% gewijzigd door Woy op 13-02-2009 09:25 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1