首页 新闻 会员 周边 捐助

问个很变态的问题,希望有变态的高手帮帮忙

1
悬赏园豆:20 [已解决问题] 解决于 2012-02-11 09:39

我用c#做了一个类库项目编译为dll以便于其他应用程序调用。我想知道能不能在这个类库项目的代码里获取调用自身的是asp.net项目还是 win32项目或者窗体应用程序?

全球通的主页 全球通 | 初学一级 | 园豆:22
提问于:2012-02-08 19:33
< >
分享
最佳答案
0

非常严格准确的判断好像有点难,根据加载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的方法去调用了你的托管程序。

收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-02-09 15:54
其他回答(4)
0

AppDomain中应该可以找到这些信息,因此DLL都是承载在这些对象中的

2012 | 园豆:21237 (高人七级) | 2012-02-08 21:59
0

web app判断 httpcontext 是否为空。(暂时找不到更好的办法。)

Environment.UserInteractive 判断是 server app 是否运行在交互模式。

收获园豆:5
waninlezu | 园豆:661 (小虾三级) | 2012-02-08 22:52

那又如何区分 控制台或者普通的winform.exe呢?

支持(0) 反对(0) 全球通 | 园豆:22 (初学一级) | 2012-02-08 23:21

@全球通: 

最操蛋的 方法。判断 当前 域中 加载的 程序集 包含 system.windows.forms.dll 为 winform (不准)

控制台 程序 一样可以 打开winform 窗口。。这该肿么区分,,


支持(0) 反对(0) waninlezu | 园豆:661 (小虾三级) | 2012-02-09 00:20
0

可以用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 来判断 如果是xxx/xxx/Web.config 说明是asp.net 项目

收获园豆:5
陈齐 | 园豆:311 (菜鸟二级) | 2012-02-08 23:01

那又如何区分 控制台或者普通的winform.exe呢?

支持(0) 反对(0) 全球通 | 园豆:22 (初学一级) | 2012-02-08 23:21

@全球通: 这个我就没有用过了

支持(0) 反对(0) 陈齐 | 园豆:311 (菜鸟二级) | 2012-02-10 17:45
0

这个需求是变态,而且感觉还有点莫名其妙,不知道为何会有如此需求。

顾晓北 | 园豆:10893 (专家六级) | 2012-02-09 10:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册