Как сделать выгрузку для метода Assembly.LoadFrom - PullRequest
0 голосов
/ 04 ноября 2018

Я работаю над компактным приложением C # с платформой win CE и использую этот код .....

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

чтобы получить версию файла, но другим способом я должен удалить старый файл, и когда я пытаюсь использовать этот код.

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

если обнаружена эта ошибка

"процесс не может получить доступ к файлу ###, потому что он используется другой процесс. "

пожалуйста, любой может помочь мне с этой проблемой.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Только для справки: это решение проблемы. просто замените класс 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);
0 голосов
/ 04 ноября 2018

Единственный способ выгрузить сборку - выгрузить домен приложения. Альтернативой может быть чтение файла в байт [] и загрузка этого байта [] в виде сборки.

...