新しいライブラリを生成し、その中でスクリプトを実行するオープンソースライブラリを作成しようとしています。PowerShellファイルの名前との名前を取得する静的メソッドがあります。このメソッドは、C#コンソールアプリから呼び出された場合は正常に実行されますが、実行されません。AppDomain
PowerShell
AppDomain
PowerShell
フュージョンログにこのエントリがあるため、dllが2番目のアプリドメインに読み込まれていることがわかります。
クラス宣言とコンストラクターは次のようになります。
public class AppDomainPoshRunner : MarshalByRefObject{
public AppDomainPoshRunner (){
Console.WriteLine("Made it here.");
}
}
コンストラクター内のそのメッセージは、C#コンソールアプリから実行するかPowerShellアプリから実行するかに関係なく、 CreateInstanceFromAndUnwrapを呼び出すと出力されます。
以下の静的メソッドでAppDomainPoshRunnerCreateInstanceFromAndUnwrap
に返された値をキャストすると、失敗が発生します。
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
私は何が間違っているのですか?