Точка входа не найдена в сборке

У меня есть приложение, в котором мне нужно создать AppDomain и загрузить в него сборку и выполнить методы в сборке.

Вот мой код

public class CreateAppDomain
{
     public void CreateAppDom()
        {
        AppDomain domain = AppDomain.CreateDomain("myDomain");
        domain.ExecuteAssembly(@"C:\Visual Studio 2005\Projects\A1\A1\bin\Debug\A1.dll");
        domain.CreateInstanceFrom(@"C:\Visual Studio 2005\Projects\A1\A1\bin\Debug\A1.dll","A1.Navigate");
        }

}

Приведенный выше код написан в файле класса с именем CreateAppDomain.cs.

На моей странице Default.aspx я создал экземпляр вышеуказанного класса и вызвал метод создания. Вот код

protected void Button1_Click(object sender, EventArgs e)
    {
        CreateAppDomain obj = new CreateAppDomain();
        obj.CreateAppDom();
        Response.Write("Application Domain Successfully created");
    }

когда я запускаю страницу default.aspx, я получаю сообщение об ошибке

Точка входа не найдена в сборке «A1, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null».

Может ли кто-нибудь объяснить мне значение вышеуказанной ошибки и ее решение.

Спасибо,


person user490706    schedule 19.06.2011    source источник


Ответы (1)


Метод AppDomain.ExecuteAssembly() загружает сборку в указанный домен, а затем выполняет ее стандартную точку входа, то есть метод static void Main(string[] args).

Подробнее см. здесь.

То, что вы хотите, вероятно, является одной из перегрузок метода CreateInstanceAndUnwrap()

РЕДАКТИРОВАТЬ:

Я создал ConsoleApplication9, добавил помимо ClassLibrary1. В ClassLibrary1 у меня есть Class1:

namespace ClassLibrary1
{
    public class Class1 : MarshalByRefObject
    {
        public void Go()
        {
            Console.WriteLine("My AppDomain's FriendlyName is: {0}", AppDomain.CurrentDomain.FriendlyName);
        }
    }
}

В ConsoleApplication9 это:

private static void Main(string[] args)
{
    Console.WriteLine("Trying to run method in current domain...");
    var inCurrentDomain = new Class1();
    inCurrentDomain.Go();

    Console.WriteLine("\nTrying to run method in remote domain...");
    string asmName = typeof(Class1).Assembly.FullName;
    string typeName = typeof (Class1).FullName;
    Console.WriteLine("Class1's assembly name is: {0}\nType name: {1}", asmName, typeName);

    var remoteDomain = AppDomain.CreateDomain("My remote domain");
    var remoteObject = (Class1)remoteDomain.CreateInstanceAndUnwrap(asmName, typeName);
    Console.WriteLine("\nRemote instance created. Running Go() method:");
    remoteObject.Go();
}

При запуске у меня есть:

Trying to run method in current domain...
My AppDomain's FriendlyName is: ConsoleApplication9.exe

Trying to run method in remote domain...
Class1's assembly name is: ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Type name: ClassLibrary1.Class1

Remote instance created. Running Go() method:
My AppDomain's FriendlyName is: My remote domain
person Ivan Danilov    schedule 19.06.2011
comment
Да, но у вас нет static void Main в .dll, это просто в приложениях (CLI или GUI), например. .exe файлы. - person ; 19.06.2011
comment
Ты прав. Точка входа задается в метаданных и может быть изменена. В любом случае, насколько я понял, это не то, чего хочет ОП. Он хочет создать какой-то экземпляр в удаленном домене и вызвать его, а не выполнять какой-то один метод, как бы он ни назывался. - person Ivan Danilov; 19.06.2011
comment
Спасибо .. Я пытался использовать CreateInstanceAndUnwrap() вместо createInstanceFrom(), но не повезло, я получаю ту же ошибку - person user490706; 20.06.2011
comment
Я только что обновил свой ответ. Я предполагаю, что вы неправильно передаете AssemblyName и/или вводите имя. В моем примере есть прямая ссылка из консольного приложения на библиотеку, но это не обязательно. Вы просто не можете привести возвращаемый результат к конкретному классу, если у вас нет ссылки. - person Ivan Danilov; 20.06.2011