这几天没事写了个小工具提升效率,结果,东西写出来了,只能在自己电脑用
发给朋友,首先 xp 不能用,换成 win7
再然后,不能运行,看报错,是我有行代码调用了系统 wininet.dll 这里,用它取 cookies
为毛用它?因为 c#自带的函数取 cookies 取的不全啊我滴哥!!!
真是日狗了,写了好几天,性高彩烈地发给别人,结果不能用,现在还没解决
搞 c#客户端的朋友们你们平时这样嘛?
1
em70 2016-10-16 23:14:00 +08:00 via Android 2
.net 本来就不适合做桌面应用,主战场在企业级应用
做桌面程序最好的选择是 Delphi ,做出来的程序可以在 win 和 mac 桌面无需任何额外库直接运行 |
2
ipwx 2016-10-16 23:15:19 +08:00 1
Try Qt
|
3
em70 2016-10-16 23:18:21 +08:00 via Android
再补充一下, Delphi 之父和 C#之父是同一个人: Anders Hejlsberg
|
4
pmpio 2016-10-16 23:19:02 +08:00 2
|
5
only0jac OP |
6
Quaintjade 2016-10-16 23:33:17 +08:00 1
|
7
pmpio 2016-10-17 00:33:57 +08:00 via Android
@Quaintjade 就是呀。按理说, VB 也算是“可管理代码”,因为它是靠解释引擎来运行的。
|
8
zhuangzhuang1988 2016-10-17 00:38:46 +08:00 3
这个和 c#没关系啊
你自己说了用了 wininet.dll , 肯定是你用了 win7 下才有的函数的。 wininet.dll 也是有自己的版本的。 软件要做系统兼容肯定也要先看下 wininet.dll 存在不存在对应函数的 |
9
bdbai 2016-10-17 00:38:47 +08:00 via Android 2
@pmpio VB6 直接编译成机器码,到 .NET 才有 managed code 一说,但也不是靠解释引擎跑的。
|
10
xbb7766 2016-10-17 00:45:58 +08:00 via Android 1
要保险的话把你开发环境的 wininet.dll 一起打包过去不就可以了。
有时候 DLL 版本不对的确会出问题的。 |
13
em70 2016-10-17 01:30:42 +08:00
|
14
theoractice 2016-10-17 01:36:16 +08:00 1
感觉有可能是.net 版本问题。.net 4.0 之前的 HttpWebRequest 不会获取跨域的 cookie 。切到.net 4.0 再试试。
|
15
theoractice 2016-10-17 01:39:19 +08:00
@em70 win10 的 uwp 用 c#开发的很多哦
|
16
yangff 2016-10-17 01:49:09 +08:00 1
wininet.dll windows7 没问题吧
|
17
enenaaa 2016-10-17 01:51:11 +08:00 via Android 1
这不是 c#的问题啊,系统自带的动态库版本太旧,用其他语言写的本地程序也会出问题。
要么在编译时选用老一点的 windows sdk ,要么就多测试自带 dll 吧 |
18
lhw45202 2016-10-17 02:03:13 +08:00 1
|
19
abelyao 2016-10-17 02:06:10 +08:00 via iPhone 1
写客户端的程序就是要考虑兼容性啊… 尤其调用了非 .net 类库的时候…
这跟写前端要考虑不同浏览器是一个道理,运行环境不同都多多少少会有一些兼容问题 |
20
soratadori 2016-10-17 02:48:36 +08:00 1
有人知道 OSU ( http://osu.ppy.sh )不,是用 c#写的,代价就是挺简单的游戏,因为延迟的问题,结果对机器要求挺高的。
|
21
mingl0280 2016-10-17 04:40:19 +08:00 via Android 1
c#用 native API 拿 cookie 本来就不对,怎么还成了 c#的锅了
|
24
xiamx 2016-10-17 07:25:49 +08:00 1
你自己调用 native 的 dll 的问题跟 C# 有啥关系
|
25
only0jac OP @zhuangzhuang1988 不是的,我只是调用获取 cookies , win7 到 10 都有这个 dll
@xbb7766 这个没法打包吧?这个是系统的 dll @theoractice 我用的.net 4.5.2 @enenaaa 选老一点 window sdk ?? @mingl0280 我也不想用 native api , c#自带的获取 api 有时候是获取不全的,只能通过这种方式 |
26
only0jac OP |
27
kelvansun 2016-10-17 08:25:30 +08:00 1
你写的程序 .net 库版本用得太高了,我的是用 win7 下 VS2013 基于.net framework4 开发的 winform 程序,最后用一键发布到服务器上,最后部署到 xp 用户下,一切很正常啊
|
28
murmur 2016-10-17 08:26:48 +08:00
@soratadori osu 是挺简单的游戏, 6666 为啥我四星还在挣扎
|
29
only0jac OP @kelvansun 一键发布到服务器???我用了 nuget 中的一个库,这库需要 4.5 版本,你 4.0 可以在 xp 下运行???
|
30
only0jac OP @kelvansun 对了忘记说了,我的主窗口是能打开的,只有点获取 cookies 时才报错
|
31
kelvansun 2016-10-17 08:33:03 +08:00
|
35
only0jac OP @kelvansun 谢谢,我的不用支持 xp ,能 win7 以上就行了,我把我本机的系统 dll 拷到目标机 system32 中试试吧
|
36
zkd8907 2016-10-17 08:41:48 +08:00 1
=。= 为什么没办法打包
早年很多小软件打开的时候经常出现“ xxx.dll 未加载”,多并就是作者使用了某些库没有打包导致的,网上还有专门提供 dll 下载的网站,需求量还挺大的 |
37
only0jac OP @zkd8907 因为 wininet.dll 是系统自带的,我把这个文件放到我的 exe 运行目录了,不过好像优先调用系统的
|
38
JayFang1993 2016-10-17 08:45:35 +08:00 1
我之前有个项目 目标平台是 Windows Server2003 真是日狗了~
|
39
hjc4869 2016-10-17 08:49:00 +08:00 via iPhone
@soratadori osu 我用 atom 平板都能跑 1080p 60fps 而且瓶颈根本不在 cpu 好吗,延迟只要关掉 vsync 就没有问题了……
|
40
wuethan 2016-10-17 08:50:48 +08:00 1
4.5.2 ...................................... 真先进 2.0+linq 做 UI 杠杠的 做企业级没问题 关键楼主要会找 dll
|
41
lslqtz 2016-10-17 08:56:08 +08:00
@soratadori 我就是说 osu!的 C#源码,还有,我平板都有 30 帧。。 Z2***的 CPU 。
@hjc4869 我只能跑 30 帧...有点卡。 @murmur 我也在 3-4*挣扎,安利个 osu!上传 h 图的小工具给你。 https://www.osupink.org/ss/ https://osu.ppy.sh/ss/6342355 |
42
missdeer 2016-10-17 09:03:39 +08:00
上面说没有用.NET 做桌面开发的,是自己孤陋寡闻吧
微软现在自己的产品,往往都是.NET 和 Native C++混合开发的,你没看出来而已 开源项目也有一些比较有名的用.NET 开发的,比如 Keepass |
43
allen9527 2016-10-17 09:05:40 +08:00 1
来这里问 C#问题,没结论的。
你调用的本地特定版本的库,所以有问题喽,原生的我记得是有办法取 cookie 的。。。 编译生成。 exe 不是打包。。。,有专门的生成安装包的方法 |
44
yamada 2016-10-17 09:07:59 +08:00 via Android 1
c#的 httpwebrequest 确实获取 cookie 会有缺失 ,老问题了,建议还是用 httpclient 替代,但条条框框设置的比较严格设置 http header 都要用强类型而不是字符串,而且有不能获取 content-length 的问题,反正坑很多
|
45
hjc4869 2016-10-17 09:13:42 +08:00 via iPhone 1
@lslqtz 用 bay trail 就好了, clover trail 连指令乱序发射都没有, GPU 也跟没有差不多,真不知道 intel 是怎么想的,连当时的 ARM 都不如(
|
46
only0jac OP |
48
dong3580 2016-10-17 09:22:17 +08:00 via Android 1
@only0jac
不要调系统自带的 dll ,就算掉也打包进去吧。 4.5 貌似对 xp 不友好,改到 4.0 。另外 44 楼的方法试试,我从来不用内置的系统级别的 api |
49
jeremaihloo 2016-10-17 09:23:16 +08:00 2
.Net 自己的库你不用,非要用个什么 winnet.dll ,每个系统这东西版本不一样和.net 有什么关系,强行.net 的问题
这个社区对.Net 本来就不友好,你还来黑一下 这就好像你 WinXP 非要用用到 dwmapi.dll 的东西一样,肯定会出现问题的 说没有用.Net 做桌面开发的,那只是你不了解 至于说游戏问题的,不太了解,不太好发表意见,不过关于性能的应该都是 C++之类的,毕竟 C#确实要慢一点 |
50
ragnaroks 2016-10-17 09:37:15 +08:00 1
直接把那个 dll 拖到你应用程序目录...
以前 GTAV 的作弊器都是替换 GTAV 的 dll 做的 |
51
only0jac OP @yicong135 谢谢,回去试一下,不过我用了一个 http 库,它需要 4.5.2 ,所以我也用的这个
@dong3580 我把系统 dll 放在运行目录也没用,我也不想用系统 api ,这不是自带的取不全 cookies 嘛 @jeremaihloo 能用的话我能不用吗,因为获取不全呀 |
53
MrSong0607 2016-10-17 09:40:33 +08:00 1
我是这么取 cookie 的,没遇到过啥问题,代码给 LZ 参考下
/// <summary> /// /// </summary> /// <param name="cc"></param> /// <returns></returns> public static List<Cookie> GetAllCookies(CookieContainer cc) { List<Cookie> lstCookies = new List<Cookie>(); Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); foreach (object pathList in table.Values) { SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }); foreach (CookieCollection colCookies in lstCookieCol.Values) foreach (Cookie c in colCookies) lstCookies.Add(c); } return lstCookies; } |
54
chuxiwen 2016-10-17 09:41:58 +08:00 via iPad
XP 早就 end of life 了啊 😂
|
56
ipwx 2016-10-17 11:49:42 +08:00 1
用微软家的开发工具,就算是 VC++,最保险的方法也还是给对方塞一个 vcredist.exe 让它把库装上再说,何况是 .net 。。。我就没见过几个程序试图把 DLL 打包进去变成绿色版的(而且效果还不一定好)。
|
57
only0jac OP @MrSong0607 多谢,我的需求是获取 webBrowser 中的 cookies ,根据域名取 cookies ,这个好像不太行
|
59
MrSong0607 2016-10-17 13:02:28 +08:00
.net 框架有个 BUG ,根据域名取 cookie 的时候有些域名是取不到的,好像是他们判断域名的条件那里有问题,这个是底层的问题,要做一点小操作,然后再按域名取就可以全部取到了
/// <summary> /// this is a hackfix for microsoft bug, where cookies are not shared between www.domain.com and domain.com /// </summary> /// <param name="cc"></param> public static void ImproveCookieContainer(ref CookieContainer cc) { Hashtable table = (Hashtable)cc.GetType().InvokeMember( "m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); var comparerPreperty = table.GetType().GetField("_keycomparer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance); if (comparerPreperty != null) { comparerPreperty.SetValue(table, new DomainComparer()); } } |
60
yejinmo 2016-10-17 13:07:52 +08:00
xp 最高支持.net4.0 ,楼主 4.5.2 怎么用啊。。。
自己以前写的爬虫一直都没问题啊。。 string cookie = string.Empty; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url"); request.CookieContainer = new CookieContainer(); request.Referer = "http://url"; request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.Headers["Accept-Language"] = "zh-CN,zh;q=0."; request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3"; request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; request.KeepAlive = true; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "GET"; request.AllowAutoRedirect = false; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); cookie = response.Headers["Set-Cookie"]; myStreamReader.Close(); myResponseStream.Close(); |
61
woshihuzios123 2016-10-17 13:29:45 +08:00
|
62
only0jac OP |
63
only0jac OP @woshihuzios123 我现在已经换成.net 4.0 了, xp 下正常启动,缺点是 webBrowser 不支持 Html5
|
65
Zeahoo 2016-10-17 16:44:37 +08:00
说到这个我想引出另一个话题:上学的时候,期末交大作业(也就是简单的小项目),在不同电脑上反应的结果不同,简直累死我等菜鸡了 :(
|
66
stormpeach 2016-10-17 18:56:37 +08:00
还兼容 XP ?你是不是还要兼容 ie6 啊?
|
67
only0jac OP @stormpeach 没呀,都说了 win7 以上了
|
69
cxm 2016-10-17 23:57:15 +08:00
这里都能发现音游玩家 XDD
|
70
bombless 2016-10-18 01:16:05 +08:00 via Android 1
你在绝大多数平台做,部署都会是个难题……
也就类似 ios uwp 这样的平台做部署能单纯点了 |
71
omengye 2016-10-18 08:03:23 +08:00 via Android 1
可以试试 CefSharp ,嵌了 chromium 肯定可以支持 html5 ,需要注意的是版本不能高于 49 ,貌似从 chromium 50 开始就不支持 xp 了
|
73
zysuper 2016-10-18 09:13:39 +08:00 1
deiphi 活的好好的,什么时候死掉了?最新版都支持 win10 , win phone , mac , ios 呢。
https://www.embarcadero.com/products/delphi |
74
only0jac OP 感觉玩 delphi 的很少,出问题查资料不太好查
|
75
omengye 2016-10-18 10:23:43 +08:00 via Android 1
@only0jac 获取 cookie 是从 chromium 里调的,我之前没有用到 cookie ,所以具体操作不是很清楚,不过刚看了一个 issue https://github.com/cefsharp/CefSharp/issues/826 你可以试一试
|
77
zjddp 2016-10-20 10:41:53 +08:00
@lslqtz 去年刚工作的时候就想在 mac 下重写 osu ,按照 wiki 的资料能读谱面数据了,但是绘图这块以前没接触过,完全没有头绪,后来小伙伴发我 osu 的源码,没有 vs 环境就放一边了。
|
78
mingl0280 2016-11-14 23:51:58 +08:00 1
@mingl0280 是这样的, C#拿 Cookie 必须用 HttpWebRequest/HttpWebResponse
拿下来的是 Header 里面的 Set-Cookie String 你自己做个给请求填充 Cookie 的就行 以前做过一个 vb.net 的 http 模拟在这 https://github.com/mingl0280/evelogger/blob/master/WebLogger.EVE.Ver1/Module1.vb GetWebResponse 和 SetCookieHeaders |
79
only0jac OP |