3

リモート可能なオブジェクトを作成しようとして、すべてが正常に機能しているように見えてもエラーが発生したため、Microsoft(http://msdn.microsoft.com/en-us)から直接サンプルコードを簡略化して実行することにしました。 /library/system.marshalbyrefobject.aspx)。

このコードを実行すると、CreateInstanceAndUnwrap()を呼び出すときにTypeLoadExceptionが発生します。しかし、ラップトップで試してみたところ、問題なく動作しました。なぜそれがラップトップでは機能するがデスクトップでは機能しないのか、誰かが何か手がかりを持っていますか?それぞれにコンソールアプリを作成し、以下のコードをコピーして貼り付けただけなので、2つの違いがわかりません。

using System;
using System.Reflection;

public class Worker : MarshalByRefObject
{
    public void PrintDomain() 
    { 
        Console.WriteLine("Object is executing in AppDomain \"{0}\"",
            AppDomain.CurrentDomain.FriendlyName); 
    }
}

class Example
{
    public static void Main()
    {
        // Create an ordinary instance in the current AppDomain
        Worker localWorker = new Worker();
        localWorker.PrintDomain();

        // Create a new application domain, create an instance 
        // of Worker in the application domain, and execute code 
        // there.
        AppDomain ad = AppDomain.CreateDomain("New domain");
        Worker remoteWorker = (Worker) ad.CreateInstanceAndUnwrap(
            Assembly.GetExecutingAssembly().FullName,
            "Worker");
        remoteWorker.PrintDomain();
    }
}

編集:それで、ローカルドメインでアクティベーターを使用してタイプのインスタンスを作成しようとしましたが、それでもファイルまたはアセンブリ'System.RuntimeType'またはその依存関係の1つをロードできなかったというエラーが発生しました。これが.NetFrameworkの内部型であり、必要な場合でもデプロイを阻止できなかったため、今はかなり困惑しています。

編集:InnerExceptionはありませんが、スタックは次のとおりです。

   at System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type)
   at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
   at System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(String assemblyName, String typeName)
   at System.AppDomain.CreateInstance(String assemblyName, String typeName)
   at System.AppDomain.CreateInstance(String assemblyName, String typeName)
   at ConsoleApplication1.Example.Main(String[] args) in D:\Projects\Remoting\ConsoleApplication1\Program.cs:line 28
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

ああ、例外は次のとおりです。

{"Could not load type 'Worker' from assembly 'ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.":"Worker"}

また、次のコード行を実行してみました。

var w = Activator.CreateInstance(typeof(Worker).GetType().FullName, "Worker");

そしてFileNotFoundExceptionを取得しました:

Could not load file or assembly 'System.RuntimeType' or one of its dependencies.  The system cannot find the file specified.
4

1 に答える 1

8

最初のコードでは、不完全な型名をインスタンス化しようとしています。Worker に名前空間がない場合を除き、そのコードはどこでも機能しないはずです。そのはず:

var workerType = typeof(Worker);
Worker remoteWorker = (Worker) ad.CreateInstanceAndUnwrap(
            // Where Worker is defined (probably the same as current assembly in you case)
            workerType.Assembly.FullName,
            // Worker's *fully-qualified* typename, including the namespace 
            workerType.FullName); 

ローカル アクティベーション コードが ではtypeof(Worker).GetType().FullNameなく誤って呼び出していtypeof(Worker).FullNameます。

typeof(Anything).GetType()必ず戻ってきますSystem.RuntimeType

于 2013-01-19T13:05:52.617 に答える