每次运行此代码时我都会收到错误:
AppDomain newDomain = AppDomain.CreateDomain("newDomain");
AssemblyName assemblyName = AssemblyName.GetAssemblyName(path);
Command cmd = (Command)newDomain.CreateInstanceAndUnwrap(assemblyName.FullName, typename);
cmd.Execute();
其中path
是Dll的路径,typename
是“NWT_Projekt.TestClass”
我的命令类:
using System;
namespace NWT_Projekt
{
public interface Command
{
void Execute();
}
}
这是DLL的源代码
using System;
using System.Collections;
using System.Xml;
using System.IO;
using System.Windows.Forms;
namespace NWT_Projekt
{
public class TestClass : NWT_Projekt.Command
{
public MainForm f;
public TestClass()
{
f = Form.ActiveForm as MainForm;
}
public void Execute()
{
//do something
}
}
}
错误(谷歌翻译:D)
NWT PRojekt.exe中出现“System.Runtime.Serialization.SerializationException”类型的异常。
附加信息:Assembly'脚本中的类型“NWT_Projekt.TestClass”,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化。
EDIT2:
使用[Serializable]它现在可以正常工作,但在我运行代码一次然后我想创建第二个dll它会给我一个IO错误,因为该文件正在使用中! 我该如何解决这个问题?
答案 0 :(得分:0)
如果您希望命令在自己的appDomain上运行,则应使用MarshalByRefObject。
using System;
using System.Collections;
using System.Xml;
using System.IO;
using System.Windows.Forms;
namespace NWT_Projekt
{
public class TestClass : MarshalByRefObject, NWT_Projekt.Command
{
public MainForm f;
public TestClass()
{
f = Form.ActiveForm as MainForm;
}
public void Execute()
{
//do something
}
}
}
我建议你为接口加上前缀:ICommand