【问题标题】:How to make unload for Assembly.LoadFrom method如何为 Assembly.LoadFrom 方法进行卸载
【发布时间】:2026-01-04 12:35:01
【问题描述】:

我正在开发一个带有 win CE 平台的 C# 紧凑型应用程序,我正在使用此代码.....

var assembly = Assembly.LoadFrom(assemblyFile);
Version ver = assembly.GetName().Version;
theVsertion = ver.ToString();

要获取文件版本,但在另一种方法中,我必须删除旧文件,并且当我尝试使用此代码时。

        if (File.Exists(assemblyFile))
        {
            File.Delete(assemblyFile);
        }

如果发现这个错误

" 进程无法访问文件 ### 因为它正被 另一个进程。”

拜托,任何人都可以帮助我解决这个问题。

【问题讨论】:

    标签: c# .net compact-framework windows-ce


    【解决方案1】:

    仅作记录:这是问题的解决方案。 只需用此代码替换 Assembly 类即可。

    public static Version GetFileVersionCe(string fileName)
    {
        int handle = 0;
        int length = GetFileVersionInfoSize(fileName, ref handle);
        Version v = null;
        if (length > 0)
        {
            IntPtr buffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(length);
            if (GetFileVersionInfo(fileName, handle, length, buffer))
            {
                IntPtr fixedbuffer = IntPtr.Zero;
                int fixedlen = 0;
                if (VerQueryValue(buffer, "\\", ref fixedbuffer, ref fixedlen))
                {
                    byte[] fixedversioninfo = new byte[fixedlen];
                    System.Runtime.InteropServices.Marshal.Copy(fixedbuffer, fixedversioninfo, 0, fixedlen);
                    v = new Version(
                        BitConverter.ToInt16(fixedversioninfo, 10), 
                        BitConverter.ToInt16(fixedversioninfo,  8), 
                        BitConverter.ToInt16(fixedversioninfo, 14),
                        BitConverter.ToInt16(fixedversioninfo, 12));
                }
            }
            Marshal.FreeHGlobal(buffer);
        }
        return v;
    }
    
    [DllImport("coredll", EntryPoint = "GetFileVersionInfo", SetLastError = true)]
    private static extern bool GetFileVersionInfo(string filename, int handle, int len, IntPtr buffer);
    [DllImport("coredll", EntryPoint = "GetFileVersionInfoSize", SetLastError = true)]
    private static extern int GetFileVersionInfoSize(string filename, ref int handle);
    [DllImport("coredll", EntryPoint = "VerQueryValue", SetLastError = true)]
    private static extern bool VerQueryValue(IntPtr buffer, string subblock, ref IntPtr blockbuffer, ref int len);
    

    【讨论】:

      【解决方案2】:

      卸载程序集的唯一方法是卸载 AppDomain。 另一种方法是将文件读入 byte[] 并将此 byte[] 作为程序集加载。

      【讨论】:

      • 谢谢,我已经尝试过使用 AppDomain 类,但不幸的是,我没有使用完整的 .Net 类,我使用的是紧凑的 .Net,所以如果你有代码示例,请分享和我一起。
      • 刚刚找到这个link
      • 不幸的是“GetAssemblyName”方法不属于紧凑的.Net,
      • 在引用的页面上向下滚动一点,你会发现GetFileVersionCe
      最近更新 更多