Я пытался создать удаленный объект и получал ошибки, хотя казалось, что все в порядке, поэтому я решил упростить и запустить образец кода прямо из Microsoft (http://msdn.microsoft.com/en-us). /library/system.marshalbyrefobject.aspx).
Когда я запускаю этот код, я получаю TypeLoadException, когда он вызывает CreateInstanceAndUnwrap(). Тем не менее, я только что попробовал это на своем ноутбуке, и он работал нормально. Кто-нибудь знает, почему это будет работать на ноутбуке, но не на рабочем столе?? Я только что создал консольное приложение для каждого и скопировал/вставил приведенный ниже код, поэтому я не понимаю, чем они отличаются друг от друга.
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();
}
}
РЕДАКТИРОВАТЬ: Итак, я только что попытался создать экземпляр типа с помощью Activator в локальном домене, и даже это дало мне ошибку, говорящую о том, что он не может загрузить файл или сборку «System.RuntimeType» или одну из его зависимостей. Видя, что это внутренний тип для .Net Framework, который я не мог бы предотвратить его развертывание, даже если бы захотел, я сейчас совершенно сбит с толку.
РЕДАКТИРОВАТЬ: нет 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.