У меня будет список DLL в папке, я хочу проверить наличие DLL для приложения или нет. Если так, я хочу добавить это имя приложения в grid.Can, любой из них расскажет, как это сделать программно. Спасибо в Advance
Программно. Проверить dll существует в Gac или нет. Если так отображать его в сетке
Ответ 1
Сделайте сборку .LoadFrom и проверьте GlobalAssemblyCache
testAssembly = Assembly.LoadFrom(dllname);
if (!testAssembly.GlobalAssemblyCache)
{
// not in gac
}
Ответ 2
Я считаю, что правильным способом является API Fusion COM.
Здесь, как его использовать:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace IsAssemblyInGAC
{
internal class GacApi
{
[DllImport("fusion.dll")]
internal static extern IntPtr CreateAssemblyCache(
out IAssemblyCache ppAsmCache, int reserved);
}
// GAC Interfaces - IAssemblyCache. As a sample, non used vtable entries
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")]
internal interface IAssemblyCache
{
int Dummy1();
[PreserveSig()]
IntPtr QueryAssemblyInfo(
int flags,
[MarshalAs(UnmanagedType.LPWStr)]
String assemblyName,
ref ASSEMBLY_INFO assemblyInfo);
int Dummy2();
int Dummy3();
int Dummy4();
}
[StructLayout(LayoutKind.Sequential)]
internal struct ASSEMBLY_INFO
{
public int cbAssemblyInfo;
public int assemblyFlags;
public long assemblySizeInKB;
[MarshalAs(UnmanagedType.LPWStr)]
public String currentAssemblyPath;
public int cchBuf;
}
class Program
{
static void Main()
{
try
{
Console.WriteLine(QueryAssemblyInfo("System"));
}
catch(System.IO.FileNotFoundException e)
{
Console.WriteLine(e.Message);
}
}
// If assemblyName is not fully qualified, a random matching may be
public static String QueryAssemblyInfo(String assemblyName)
{
ASSEMBLY_INFO assembyInfo = new ASSEMBLY_INFO ();
assembyInfo.cchBuf = 512;
assembyInfo.currentAssemblyPath = new String('\0',
assembyInfo.cchBuf) ;
IAssemblyCache assemblyCache = null;
// Get IAssemblyCache pointer
IntPtr hr = GacApi.CreateAssemblyCache(out assemblyCache, 0);
if (hr == IntPtr.Zero)
{
hr = assemblyCache.QueryAssemblyInfo(1, assemblyName, ref assembyInfo);
if (hr != IntPtr.Zero)
{
Marshal.ThrowExceptionForHR(hr.ToInt32());
}
}
else
{
Marshal.ThrowExceptionForHR(hr.ToInt32());
}
return assembyInfo.currentAssemblyPath;
}
}
}
Использовать метод QueryAssemblyInfo
.
Ответ 3
Здесь документация для недокументированного API GAC: DOC: API-интерфейсы глобального сборщика (GAC) не документированы в комплекте разработки программного обеспечения .NET Framework (SDK ) Документация.
Этот API предназначен для использования из собственного кода, поэтому эта статья может помочь вам запрограммировать его с С#.
Если вы после быстрого решения, gacutil /l
работает.
Ответ 4
Обычно люди делают предположение, что GAC находится в сборке c: \\, что на 99% истинно. Таким образом, вы можете написать код для повторения файлов, найденных в этой папке.
Более ортодоксальным способом будет использование API Fusion, который основан на COM. Управляемый обертку доступен на этом сайте блога:
http://blogs.msdn.com/junfeng/archive/2004/09/14/229653.aspx
На сайте также содержится пример управляемого кода, показывающий, как использовать API Fusion для перечисления установленных сборок - код в значительной степени выписан для вас, поэтому просто ctrl + c, а затем ctrl + v...:)
http://blogs.msdn.com/b/junfeng/archive/2004/09/14/229650.aspx
НТН...
Ответ 5
Я знаю, что это старый вопрос, но ради новых путешественников...
У нас есть (бесплатная) библиотека слияния, доступная для скачивания в http://dilithium.co.za/info/products/gac-api/, которая делает именно это. Раскрытие информации: Да, я аффилирован. Нет, я не получу денег, если вы загрузите.; -)