私はVSTOプロジェクトに取り組んでいます。アンインストール時に、vsto プロジェクトのアセンブリが使用されているかどうかを検出したいですか? アセンブリが使用されている場合は、アンインストール アクションを停止したいためです。
アンインストール時に Installer クラスを使用してコードを実行しています。
私はVSTOプロジェクトに取り組んでいます。アンインストール時に、vsto プロジェクトのアセンブリが使用されているかどうかを検出したいですか? アセンブリが使用されている場合は、アンインストール アクションを停止したいためです。
アンインストール時に Installer クラスを使用してコードを実行しています。
あなたの場合、しばらく前に Excel VSTO プラグイン プロジェクト用に書いた次のカスタム関数を再利用できると思います。インストーラー クラスに貼り付けて、Uninstall
イベント ハンドラーで呼び出します。
Process[] xlProc;
public bool isExcelRunning()
{
try
{
xlProc = Process.GetProcessesByName("excel");
if (xlProc.Length > 0)
{
logEvents("A running instance of Excel has been detected. The installation is stopping.");
return true;
}
}
catch { }
return false;
}
それが多少役立つことを願っています。
このコードを使用して、特定のアセンブリが読み込まれているかどうかを確認できます。
using System;
using System.Runtime.InteropServices;
namespace ConsoleTestAssembly
{
class Program
{
static void Main()
{
string response;
var exist = AssemblyExist("Camelot.SharePointConnector", out response);
Console.WriteLine(string.Concat(exist, Environment.NewLine, response, Environment.NewLine));
exist = AssemblyExist("Camelot.SharePointIntegration", out response);
Console.WriteLine(string.Concat(exist, Environment.NewLine, response, Environment.NewLine));
exist = AssemblyExist("Camelot.NoExisting", out response);
Console.WriteLine(string.Concat(exist, Environment.NewLine, response, Environment.NewLine));
Console.ReadKey();
}
public static bool AssemblyExist(string assemblyname, out string response)
{
try
{
response = QueryAssemblyInfo(assemblyname);
return true;
}
catch (System.IO.FileNotFoundException e)
{
response = e.Message;
return false;
}
}
// If assemblyName is not fully qualified, a random matching may be
public static String QueryAssemblyInfo(string assemblyName)
{
var assembyInfo = new AssemblyInfo {cchBuf = 512};
assembyInfo.currentAssemblyPath = new String('', assembyInfo.cchBuf);
IAssemblyCache assemblyCache;
// Get IAssemblyCache pointer
var 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;
}
}
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 AssemblyInfo assemblyInfo);
int Dummy2();
int Dummy3();
int Dummy4();
}
[StructLayout(LayoutKind.Sequential)]
internal struct AssemblyInfo
{
public int cbAssemblyInfo;
public int assemblyFlags;
public long assemblySizeInKB;
[MarshalAs(UnmanagedType.LPWStr)]
public String currentAssemblyPath;
public int cchBuf;
}
}
プロセス/アセンブリが実行されているかどうかを判断するために、次のことを使用していました。
System.Diagnostics.Process を使用します。
Process[] processlist = Process.GetProcessesByName("Yourassemblyname");
また
Process[] processlist = Process.GetProcesses();
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx