>From what I can see, in the end you do
> jObject = null;
which causes object destruction on the GC thread,
but it was created on the main thread. This may be disastrous.
To avoid this, you need to release COM object explicitly
(google it):
#region IDisposable Members
public void Dispose() {
if (_comobj != null) {
Marshal.FinalReleaseComObject(_comobj);
GC.SuppressFinalize(_comobj);
_comobj = null;
} else {
// MyTrace.Write("Disposing uninitialized object.");
}
}
(Also, shouldn't it be FormClosed event?)
However, this does not fix the error, only to track it easily.
It allows to place the breakpoint and see that the crash
happens in release:
Marshal.FinalReleaseComObject(_comobj);
Switching back to j601 does not reproduce the error.
wd 'pc f;...pshow...' does not help.
Crash details:
Unhandled exception at 0x7c915375 (ntdll.dll) in j.exe: 0xC0000005: Access
violation reading location 0x00e3000c.
> ntdll.dll!bsearch() + 0x1a2 bytes
[Frames below may be incorrect and/or missing, no symbols loaded for
ntdll.dll]
ntdll.dll!bsearch() + 0x157 bytes
ntdll.dll!bsearch() + 0xba bytes
ntdll.dll!RtlFindActivationContextSectionString() + 0x80 bytes
ntdll.dll!RtlDosApplyFileIsolationRedirection_Ustr() + 0x34e bytes
ntdll.dll!RtlDosApplyFileIsolationRedirection_Ustr() + 0x20f bytes
ntdll.dll!LdrGetDllHandleEx() + 0xa7 bytes
ntdll.dll!LdrGetDllHandle() + 0x18 bytes
kernel32.dll!GetModuleHandleW() + 0x57 bytes
kernel32.dll!GetModuleHandleW() + 0x16e bytes
kernel32.dll!GetModuleHandleW() + 0x1f bytes
kernel32.dll!GetModuleHandleA() + 0x1f bytes
j.exe!00453a98()
j.exe!00453abc()
j.exe!00453ce1()
j.exe!00453d06()
j.exe!00418073()
j.exe!004189fc()
j.exe!00430f54()
ole32.dll!DcomChannelSetHResult() + 0x190 bytes
ole32.dll!77600b36()
ole32.dll!77600b43()
j.exe!0042d0a4()
j.exe!0042f5b7()
j.exe!0043f767()
j.exe!0042a882()
j.exe!00435a6a()
j.exe!0042f644()
user32.dll!GetDC() + 0x6d bytes
user32.dll!GetDC() + 0x14f bytes
user32.dll!GetWindowLongW() + 0x127 bytes
user32.dll!DispatchMessageW() + 0xf bytes
j.exe!00418230()
j.exe!00417c54()
j.exe!0046756e()
j.exe!0045143d()
kernel32.dll!RegisterWaitForInputIdle() + 0x49 bytes
> From: Alex Rufon <[EMAIL PROTECTED]>
>
> I'm currently in the process of migrating to J602a (again) and I hit a
> brick wall. J would crash right after the calling .NET application
> exits.
>
> First off, I'm using the following softwares:
> 1. Vista Ultimate
> 2. C# on Visual Studio .NET 2005 Professional Edition
>
> Since I know that not everyone has my version of Visual Studio .NET, I
> replicated the problem using the FREE Visual Studio .NET 2008 Express
> Edition. You can download a copy from here:
> http://www.microsoft.com/express/default.aspx
>
> So follow these steps to replicate the crash:
> 1. Run Microsoft Visual C# 2008 Express Edition
> 2. Create a new Windows Application project. The automatically created
> project should have a form named form1
> 3. Add a reference to J602\bin\j.exe
> 4. Add a button to form1
> 5. Add the following code into form1:
>
> using System;
> using System.Collections.Generic;
> using System.ComponentModel;
> using System.Data;
> using System.Drawing;
> using System.Linq;
> using System.Text;
> using System.Windows.Forms;
>
> namespace WindowsFormsApplication1
> {
> public partial class Form1 : Form
> {
> private JEXEServerLib.JEXEServerClass jObject;
> public Form1()
> {
> InitializeComponent();
> }
>
> private void Form1_Load(object sender, EventArgs e)
> {
> jObject = new JEXEServerLib.JEXEServerClass();
> jObject.Quit();
> }
>
> private void button1_Click(object sender, EventArgs e)
> {
> jObject.Do("[res=: i. 1024 1024");
> }
>
> private void Form1_FormClosing(object sender,
> FormClosingEventArgs e)
> {
> jObject = null;
> }
> }
>
> }
>
> As you can see from the code above. This project will do nothing but
> create an instance of J when it loads. A button that would just make a
> 1024x1024 matrix inside the J instance and then set the jObject variable
> to nothing when it closes.
>
> The problem is that after this application closes, J will crash
> spectacularly. :)
>
> I have tested this in VB.NET and C# in both Visual Studio .NET 2005
> Professional and 2008 Express edition.
>
> I am hoping that I am just missing a step somewhere. Like maybe I need
> to call a "release" manually? Any insight would be helpful.
>
> Thanks.
>
> r/alex
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm