CreateInstanceAndUnwrap出错

时间:2014-02-25 16:07:55

标签: c# .net-assembly

每次运行此代码时我都会收到错误:

        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错误,因为该文件正在使用中! 我该如何解决这个问题?

1 个答案:

答案 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