Как избежать сбоя нашей программы, потому что DLL, которую она динамически загружала, глючит - PullRequest
1 голос
/ 23 февраля 2012

У меня есть DLL, написанная кем-то еще, и у нее много недостатков. Давайте предположим, что в этой DLL определен только один класс. Мне нужно импортировать эту DLL и создать экземпляр этого класса. Код DLL может быть следующим:

   [Serializable()]
    public class makeExceptionClass
    {
        public bool isStringNormalized(string aString)
        {
            // A null check should be performed
            return aString.IsNormalized();
        }
    }

Я написал небольшую программу, чтобы проверить, может ли моя программа работать, даже если dll вылетает. Программа является просто доказательством концепции. Он принимает два аргумента: первый используется для прямой загрузки DLL из сборки, а второй - для провала. Код программы следующий:

class Program
{
    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    static void Main(string[] args)
    {
        string typeOfLoading = args[0];
        string crash = args[1];

        // Load the DLL
        if (typeOfLoading.Equals("direct") == true)
        {
            Console.WriteLine("Loading directly a DLL");
            Assembly anAssembly = Assembly.Load("unloadableDLL");    // Directly load the DLL
            unloadableDLL.makeExceptionClass anObject = (unloadableDLL.makeExceptionClass)anAssembly.CreateInstance("unloadableDLL.makeExceptionClass");

            if (crash.Equals("crash") == true)
            {
                bool test = anObject.isStringNormalized(null);
            }
            else
            {
                bool test = anObject.isStringNormalized("test");
            }
        }
        else if (typeOfLoading.Equals("indirect") == true)
        {
            Console.WriteLine("Loading indirectly a DLL");
            AppDomain anAppDomain = AppDomain.CreateDomain("RemoteLoaderDomain");   // Assume it does not fail;
            Type t = typeof(unloadableDLL.makeExceptionClass);
            unloadableDLL.makeExceptionClass anObject = (unloadableDLL.makeExceptionClass)anAppDomain.CreateInstanceAndUnwrap("unloadableDLL", t.FullName);

            if (crash.Equals("crash") == true)
            {
                bool test = anObject.isStringNormalized(null);
            }
            else
            {
                bool test = anObject.isStringNormalized("test");
            }
            Console.WriteLine("Unloading the domain");
            AppDomain.Unload(anAppDomain);                
        }
        else
        {
            // don't care
        }

        // terminate
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}

Проблема в том, что моя программа падает, независимо от того, загружена ли dll напрямую или в домен приложений. Я совершенно новичок в C # (я начал этим утром), но у меня есть опыт работы с C ++.

1 Ответ

1 голос
/ 23 февраля 2012

Добавить пробовать / ловить вокруг вашего звонка:

  try
  {
    if (crash.Equals("crash") == true)
    {
      bool test = anObject.isStringNormalized(null);
    }
    else
    {
      bool test = anObject.isStringNormalized("test");
    }
  } catch (Exception ex) {
    Console.WriteLine("exception in dll call: "+ex);
  } 
...