我用c#做了一个类库项目编译为dll以便于其他应用程序调用。我想知道能不能在这个类库项目的代码里获取调用自身的是asp.net项目还是 win32项目或者窗体应用程序?
非常严格准确的判断好像有点难,根据加载dll或者特定文件判断肯定是非常不准确的,因为dll的加载和文件名都是很容易造假的。判断HttpContext在mvc和webform是可行的,但是不适合web service(web service下依然是null)。我的想法是查找StackTrace,找到托管代码的入口方法。winform和console application都是main方法,webform是ProcessRequest方法,web service没有测试过不过肯定有个最原始的托管代码方法。
StackTrace trace = new StackTrace();
var startMethod = trace.GetFrames().Last().GetMethod();
if (startMethod.Name == "Main")
{
var isWinform = Process.GetCurrentProcess().MainWindowHandle != IntPtr.Zero;
}
else if (startMethod.Name == "ProcessRequest")
{
//web form
}
else
{
//other circumstances
}
注意不要在VS debug下测试,因为VS下start method都是VS的方法去调用了你的托管程序。
AppDomain中应该可以找到这些信息,因此DLL都是承载在这些对象中的
web app判断 httpcontext 是否为空。(暂时找不到更好的办法。)
Environment.UserInteractive 判断是 server app 是否运行在交互模式。
那又如何区分 控制台或者普通的winform.exe呢?
@全球通:
最操蛋的 方法。判断 当前 域中 加载的 程序集 包含 system.windows.forms.dll 为 winform (不准)
控制台 程序 一样可以 打开winform 窗口。。这该肿么区分,,
可以用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 来判断 如果是xxx/xxx/Web.config 说明是asp.net 项目
那又如何区分 控制台或者普通的winform.exe呢?
@全球通: 这个我就没有用过了
这个需求是变态,而且感觉还有点莫名其妙,不知道为何会有如此需求。