在dll中有时需要使用主调用程序中的资源,这就要正确获取调用程序的文件名及其路径等信息。这需要和调用dll本身的文件名和路径区分开来!
这就牵扯到System.Reflection.Assembly程序集类使用了。
GetExecutingAssembly : 获取包含当前执行的代码的程序集
GetCallingAssembly : 返回调用当前正在执行的方法的方法的 System.Reflection.Assembly
下面为某个dll中的静态函数,注意区别:
- public static void GetName()
- {
- // 当前dll相关程序集名
- Debug.WriteLine(Path.GetFileName(Assembly.GetExecutingAssembly().GetName().CodeBase));
- Debug.WriteLine(Assembly.GetExecutingAssembly().GetModules()[0].Name);
- Debug.WriteLine(Assembly.GetExecutingAssembly().ManifestModule.Name);
- Debug.WriteLine("");
- Debug.WriteLine(Assembly.GetExecutingAssembly().GetName().CodeBase);
- Debug.WriteLine(Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName);
- Debug.WriteLine(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);
- Debug.WriteLine("");
- // 调用程序的相关程序集名称
- Debug.WriteLine(Path.GetFileName(Assembly.GetCallingAssembly().GetName().CodeBase));
- Debug.WriteLine(Assembly.GetCallingAssembly().GetModules()[0].Name);
- Debug.WriteLine(Assembly.GetCallingAssembly().ManifestModule.Name);
- Debug.WriteLine("");
- Debug.WriteLine(Assembly.GetCallingAssembly().GetName().CodeBase);
- Debug.WriteLine(Assembly.GetCallingAssembly().GetModules()[0].FullyQualifiedName);
- Debug.WriteLine(Assembly.GetCallingAssembly().ManifestModule.FullyQualifiedName);
- }
上面的静态函数在TestClass类中,然后在调用程序中调用该静态函数,调用程序为“GetApplicationName.exe”,如下:
- TestClass.GetName();
观察结果,如下:
- TestDll.dll
- TestDll.dll
- TestDll.dll
- \Program Files\GetApplicationName\TestDll.dll
- \Program Files\GetApplicationName\TestDll.dll
- \Program Files\GetApplicationName\TestDll.dll
- GetApplicationName.exe
- GetApplicationName.exe
- GetApplicationName.exe
- \Program Files\GetApplicationName\GetApplicationName.exe
- \Program Files\GetApplicationName\GetApplicationName.exe
- \Program Files\GetApplicationName\GetApplicationName.exe
还有一个办法,但是只能获取调用程序的文件名,不能获取完全路径,那就是通过AppDomain.CurrentDomain.FriendlyName获取,如下:
- Debug.WriteLine(AppDomain.CurrentDomain.FriendlyName);
结果:
- GetApplicationName.exe
你还可以参考这篇文章: 为Windows mobile编写设计友好的控件,里面也对AppDomain.CurrentDomain.FriendlyName做了介绍。
代码下载: