尽管手动关闭句柄,但另一个进程正在使用该文件

时间:2017-11-28 17:38:37

标签: c# filestream

我试图从我的dll中提取资源,并且我有以下代码,它有效,但它仍然保留了句柄...我不认为我和#39;我的代码有什么问题吗?

// example byte data and path
assem.GetManifestResourceStream(resourceName).CopyTo(res);
string resPath = "MyApp\\HelloWorld.dll"; // output file
byte[] resData = res.ToArray();           // output data

using (FileStream fs = new FileStream(resPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
    await fs.WriteAsync(resData, 0, resData.Length);
    references.Add(resourceName);
    log.Info("Updated resource: " + resourceName);
}

我还缺少什么?在查看了有关创建,编写和关闭流的其他几篇帖子和建议之后,这是我的代码的第四次迭代。

修改

不, dll没有被其他任何地方加载,文件不存在,在我解压缩之后,我尝试将提取的dll加载到更远的线上,这是关于File being used by another process的投诉(基本上它本身就是,但不确定为什么它不能?)......我的意思是我已经FileShare权限设置为ReadWrite我不要看别人怎么也无法访问它。

我没有安装任何其他防病毒软件,除了带有Windows 10的OOB的Microsoft Defender

流程和互动是这样的,我有以下几点:

  • 的Outlook.exe
  • MyMainLibrary.dll
  • MyPackedLibrary.dll

启动时,Outlook.exe会触发MyMainLibrary.dll中的静态功能,并从MyPackedLibrary.dll中提取资源。从技术上讲,Outlook.exe> MyMainLibrary.dll>从HellowWorld.dll中提取MyPackedLibrary.dll,然后Outlook.exe将加载HelloWorld.dll

MyMainLibrary.dll会保持手柄的打开吗?尽管它被Outlook.exe调用了吗?

EDIT2:

使用Process Explorer我可以看到OUTLOOK.EXE仍然保持我提取的dll的句柄。

使用Thread会导致任何这种有趣的行为吗?

// Outlook Startup callback function
private void OnStartupComplete(object sender, EventArgs e)
{
    // using Thread to not hog up the loading time for Outlook
    new Thread(() =>
    {
    try
        {   
            ...
            // trying to call my static function to extract my stuff here
            MyMainLibraryStuff.ExtractResources("HelloWorld.dll").Wait();
            ...
        }
        catch (System.Exception ex)
        {   
            log.Ex(ex);
        }
    }).Start();
}

0 个答案:

没有答案