“activator.createinstance()”在尝试运行时出错

时间:2013-11-17 00:19:05

标签: c# reflection

我无法解决以下错误。我很感激你的帮助。

我有以下课程:

public class GB
{
        private StreamReader sr;
        public GB()
        {
            sr = new StreamReader(new FileStream("C:\\temp.txt", FileMode.Open, FileAccess.ReadWrite));
        }
        public int MultiCall()
        {
            if (sr.ReadLine() == "test1")
                return 1;
            else
                return 0;
        }
    }

在我的表单中,有一个带有以下功能的按钮;

void buttonClick()
{
  myAssembly = Assembly.LoadFrom(dllpath); // dllpath is the dll file for GB class
  myType = myAssembly .GetType("GB");
  myObject = Activator.CreateInstance(myType);

  myMethodInfo = myType .GetMethod("MultiCall");
  returnValue = myMethodInfo.Invoke(myObject, null);

  myObject = null;
}

这是我的问题;当我第一次点击按钮时,一切都OK。但当我再次点击它时,我得到以下错误;

  

该进程无法访问文件'C:\ temp.txt',因为它正由另一个进程使用。

第一次调用后,从activator.createinstance返回的对象似乎没有被取消。虽然我通过myObject = null将其分配给空值但我仍然得到相同的错误。有什么想法吗?

THX。

2 个答案:

答案 0 :(得分:1)

GB的构造函数打开文件的ReadWrite流,但从不关闭它。随后调用GB会尝试打开同一个文件,但这显然会失败。

您需要做的是在IDisposable上实施GB,它会处理StreamReader,例如:

public class GB : IDisposable
{
    private StreamReader sr;
    private bool _isDisposed;

    public GB()
    {
        sr = new StreamReader(new FileStream("C:\\temp.txt", FileMode.Open, FileAccess.ReadWrite));
    }
    public int MultiCall()
    {
        if (sr.ReadLine() == "test1")
            return 1;
        else
            return 0;
    }

    ~GB()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool isManaged)
    {
        if(_isDisposed)
            return;

        if(isManaged)
        {
            // Ensure we close the file stream
            sr.Dispose();
        }

        _isDisposed = true;
    }
}

完成后再处理GB个实例。

// Dispose of the GB instance (which closes the file stream)
var asDisposable = (IDisposable)myObject;
asDisposable.Dispose();
出于这个原因,

IDisposable存在,以确保成功释放非托管资源。

答案 1 :(得分:0)

存储文件返回的值,然后在MultiCall方法中检查它的值。通过这种方式,您的文件将被关闭并为您处理。

public class GB
{
    private string str;
    public GB()
    {
        using (var sr = new StreamReader(new FileStream("C:\\temp.txt", FileMode.Open, FileAccess.ReadWrite)))
        {
          str = sr.ReadToEnd();
        }

    }
    public int MultiCall()
    {
        if (str == "test1")
            return 1;
        else
            return 0;
    }
}