Я пытаюсь создать библиотеку с открытым исходным кодом , которая порождает новый AppDomain
и запускает в ней скрипт PowerShell
. У меня есть статический метод, который принимает имя файла powershell и имя AppDomain
. Метод успешно выполняется при вызове из консольного приложения C #, но не PowerShell
.
Я знаю, что dll загружается во второй домен приложения из-за этой записи в fusionlog .
Объявление класса и конструктор выглядят следующим образом.
public class AppDomainPoshRunner : MarshalByRefObject{
public AppDomainPoshRunner (){
Console.WriteLine("Made it here.");
}
}
Это сообщение в конструкторе выводится, когда я вызываю CreateInstanceFromAndUnwrap независимо от того, запускаю ли я dll из консольного приложения C # или из приложения PowerShell.
Ошибка возникает, когда я приведу значение, возвращаемое CreateInstanceFromAndUnwrap
к AppDomainPoshRunner в статическом методе ниже.
public static string[] RunScriptInAppDomain(string fileName, string appDomainName = "Unamed")
{
var assembly = Assembly.GetExecutingAssembly();
var setupInfo = new AppDomainSetup
{
ApplicationName = appDomainName,
// TODO: Perhaps we should setup an even handler to reload the AppDomain similar to ASP.NET in IIS.
ShadowCopyFiles = "true"
};
var appDomain = AppDomain.CreateDomain(string.Format("AppDomainPoshRunner-{0}", appDomainName), null, setupInfo);
try {
var runner = appDomain.CreateInstanceFromAndUnwrap(assembly.Location, typeof(AppDomainPoshRunner).FullName);
if (RemotingServices.IsTransparentProxy(runner))
Console.WriteLine("The unwrapped object is a proxy.");
else
Console.WriteLine("The unwrapped object is not a proxy!");
Console.WriteLine("The unwrapped project is a {0}", runner.GetType().FullName);
/* This is where the error happens */
return ((AppDomainPoshRunner)runner).RunScript(fileName);
}
finally
{
AppDomain.Unload(appDomain);
}
}
При запуске этого в PowerShell я получаю InvalidCastExcception
с сообщением Невозможно привести прозрачный прокси к типу JustAProgrammer.ADPR.AppDomainPoshRunner
.
Что я делаю не так?