Windows 2008 - Aplikacja crashuje zamiast obsłużyć wyjątek

0

Mam kawałek kodu, który ma na celu sprawdzenie, czy na danej stacji jest zarejestrowany COM. Możliwa jest sytuacja, że COM jest zarejestrowany, ale nie ma pliku dll - wtedy również poniższe powinno zwrócić false. Wszystkie MessageBoxy są tu tylko do debugowania.

public bool IsCOMInstalled(string name)
{
try
{
MessageBox.Show("?");
var obj = Activator.CreateInstance(Type.GetTypeFromProgID(name));
MessageBox.Show("!");
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return false;
}
}


O ile powyższe działa prawidłowo na Windowsie XP i 7, to na Windows Server 2008 program się po prostu wywala zaraz po MessageBox.Show("?"); Jak to możliwe? Jak obsłużyć wyjątek tak, by był naprawdę obsłużony, a nie crashował aplikację?
0

Rozbij na dwie linie:

var type = Type.GetTypeFromProgID(name);
var obj = Activator.CreateInstance(type);

I zobacz dokładniej co się wywala. Może to przynieść rozwiązanie. (może type jest null?)

0

@Azarien, wywala się już na
var type = Type.GetTypeFromProgID(name);


Niestety, niewiele daje mi ta wiedza. Ja się spodziewam tego, że type == null, bo możliwe jest, że COMa w ogóle w systemie nie ma. Właśnie po to jest ta funkcja, by te sytuacje wykrywać. Pytanie brzmi - dlaczego nie łapie wyjątku?

W zasadzie to tu jest jeszcze ciekawiej... Zgodnie z dokumentacją: http://msdn.microsoft.com/pl-pl/library/hss5hw09.aspx jedyny wyjątek rzucany przez funkcję GetTypeFromProgID to ArgumentException: progID is null. Podmieniłam pierwszy MessageBox, by wyświetlał name - wyświetla prawidłowo nazwę biblioteki. Mimo tego, nie dochodzi do MessageBoxa zaraz po 
<code class="c#">var type = Type.GetTypeFromProgID(name);

o.O

0

Dodałam true do wywołania, nic to nie zmienia. Wciaż, zamiast obsłużyć wyjątek - crashuje.

Sprawdziłam natomiast jak to wygląda, jeżeli chodzi o inne rodzaje wyjatków, i wychodzi na to, że następujący kod:

public void test()
{
    throw new DivideByZeroException();
}

public void IsCOMInstalled(string name)
{
    try
    {
        test();
        MessageBox.Show("test");
    }
    catch (DivideByZeroException e)
    {
        MessageBox.Show("Attempted divide by zero.");
    }
}

Działa prawidłowo... (tj. pokazuje się MessageBox). Co za dziwadło... Można by podejrzewać, że błąd jest w inicjalizacji dll, ale sama dllka jest bardzo prosta, konstruktor wołanej klasy jest domyślny, klasa nie ma atrybutów, tylko jedną testową funkcję. Ale wywala zanim zawołam funkcję...

EDIT
Dalsze testy wykazały... że za żadne skarby nie da się skorzystać z tej dllki :/ (na innych stacjach of korz działa normalnie...)
Rejestruję dllkę normalnie regasmem z /codebase, dostaję komunikat, że się powiodło. Odpalam skrypt:

set o = CreateObject( "TestTools.FileSystemTools" )
MsgBox CStr(o.FileExist("C:\test.txt"))

I dostaję komunikat: "Nie można odnaleźć określonego pliku." (Na pierwszej linii.)

Nie wiecie przypadkiem, co może sprawiać, że na jednej stacji dllka działa, a na drugiej zachowuje się, jakby jej nie było (tylko gorzej)...?

0

Rozwiązanie - trzeba było dll zarejestrować za pomocą:
C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\regasm

a nie:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm

1 użytkowników online, w tym zalogowanych: 0, gości: 1