我试图从我的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>从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();
}