我希望能够像初始化字符串一样初始化类:
string str = "hello";
MyClass class = "hello";
Run Code Online (Sandbox Code Playgroud)
我真的不知道到底是string str = "hello";
做什么的.我假设"hello"
被编译器翻译成了new System.String("hello");
但我不确定.也许是不可能的,也许我错过了一些非常元素的东西; 如果是这样的话可以原谅我的无知:).我想要做的是一个类似字符串的类,但自动将字符串存储在文件中.
好的,这是读完答案后的代码:
class StringOnFile
{
private static string Extension = ".htm";
private string _FullPath;
public bool Preserve = false;
public string FullPath
{
get
{
return _FullPath;
}
}
public static implicit operator StringOnFile(string value)
{
StringOnFile This = new StringOnFile();
int path = 0;
do{
path++;
This._FullPath = Path.GetFullPath(path.ToString() + Extension);
}
while(File.Exists(This._FullPath));
using (StreamWriter sw = File.CreateText(This._FullPath))
{ …
Run Code Online (Sandbox Code Playgroud) 我正试图找到一种方法让我的程序知道WebBrowser何时导航以及何时不导航.这是因为程序将通过将在文档中注入的JavaScript与加载的文档进行交互.我没有任何其他方式知道它何时开始导航而不是处理导航事件,因为不是我的程序,而是将通过与文档交互进行导航的用户.但是,当DocumentCompleted
发生时并不一定意味着它已完成导航.我一直在谷歌搜索,发现两个伪解决方案:
在事件中检查WebBrowser的ReadyState属性DocumentCompleted
.这里的问题是,如果没有这个文件,但该文件加载的框架中,ReadyState
将Completed
即使没有完成主文档.
为了防止这种情况,他们建议,看是否网址参数传递到DocumentCompleted
比赛地址的WebBrowser
.这样我就会知道DocumentCompleted
文档中的某些其他框架没有调用它.
2的问题在于,正如我所说,我必须知道页面导航的唯一方法是处理Navigating
(或Navigated
)事件.因此,例如,如果我在Google地图中并点击搜索,Navigating
则会调用,但只是一个框架正在导航; 不是整个页面(在特定的Google案例中,我可以使用TargetFrameName
属性WebBrowserNavigatingEventArgs
来检查它是否是正在导航的帧,但帧并不总是有名称).所以在那之后,DocumentCompleted
将被调用,但不会与Url
我WebBrowser
的Url
属性相同,因为它只是一个导航的框架,所以我的程序将会永远导航它.
添加调用Navigating
和减去调用也DocumentCompleted
不会工作.它们并不总是一样的.我已经好几个月没有找到这个问题的解决方案; 我一直在使用解决方案1和2,并希望它们适用于大多数情况.我的计划是使用计时器,以防某些网页出现错误或其他问题,但我认为Google地图没有任何错误.我仍然可以使用它,但唯一更丑陋的解决方案是烧毁我的电脑.
编辑:到目前为止,这是我最接近解决方案的:
partial class SafeWebBrowser
{
private class SafeNavigationManager : INotifyPropertyChanged
{
private SafeWebBrowser Parent;
private bool _IsSafeNavigating = false;
private int AccumulatedNavigations = 0;
private bool NavigatingCalled = …
Run Code Online (Sandbox Code Playgroud) 我正在搞乱调试选项,现在我所有的例外都是这样的
System.NullReferenceException越过了本机/托管边界.
有时候,当发生异常时,VS要求我打开一些.net .cs文件,好像我有源代码一样.我希望有一些"恢复默认值"按钮.知道我需要切换到什么才能使其正常工作?
我正在编写一个小类来读取文件中的键值对列表并写入Dictionary<string, string>
.此文件将具有以下格式:
key1:value1
key2:value2
key3:value3
...
Run Code Online (Sandbox Code Playgroud)
这应该很容易,但是由于用户要手动编辑这个文件,我应该如何处理空格,制表符,额外的行跳转等等?我可以使用Replace删除空格和制表符,但是,是否还有其他"隐形"字符我缺少?
或者我可以删除所有不是字母数字的字符,":"和行跳转(因为行跳转是将一对与另一对分开),然后删除所有额外的行跳转.如果是这样,我不知道如何删除"all-except-some"字符.
当然我也可以查看"key1:value1:somethingelse"之类的错误.但是这样的东西并不重要,因为它显然是用户的错,我只会显示"无效格式"消息.我只是想处理基本的东西,然后把所有这些都放在try/catch块中以防万一其他出错.
注意:我根本不需要任何空格,即使在键或值内也是如此.
AFAIK XmlHttpRequest
我可以使用该send
方法下载和上传数据.但是WebClient
有很多方法.我不想要所有的功能WebClient
.我只是想创建一个模拟a的对象XmlHttpRequest
,除了它没有XSS限制.我也不关心将响应作为XML或甚至现在作为字符串.如果我可以把它作为一个足够好的字节数组.
我以为我可以使用UploadData
我的通用方法,但尝试使用它下载数据时失败,即使它返回响应.那么如何编写一个行为XmlHttpRequest
与send
方法类似的方法呢?
编辑:我在这里发现了一个不完整的类,它正是一个XmlHttpRequest
模拟器.太糟糕了,整个代码都丢失了.
我有一个.NET应用程序需要使用a WebBrowser
来自动浏览一堆页面.但是,如果我去谷歌并设置谷歌即时通讯,然后搜索任何内容并手动浏览下一个按钮几次,我的应用程序使用的内存将开始增加.
问题可能是Google Instant以某种方式保留了以前页面中的数据,但即使我在其他地方导航,例如"about:blank",使用的内存也不会减少.IE 9也会出现这个问题.我开始写下我在第60页使用的内存,这就是我得到的(使用IE 9):
Page 60: 180 MB
Page 70: 214 MB
Page 80: 245 MB
Page 90: 280 MB
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,内存几乎每10页增加30 - 35 MB.如果在我离开谷歌后将释放内存,这将不会成为问题.但事实并非如此.
我也试过这个并没有做任何事情.
编辑:我做了一个项目只是为了测试这个.这是我的Form1
代码:
namespace WebBrowserMemoryTest
{
public partial class Form1 : Form
{
private int _Pages;
public Form1()
{
InitializeComponent();
webBrowser1.Navigate("http://www.google.com");
}
private void startButton_Click(object sender, EventArgs e)
{
_Pages = 0;
timer1.Start();
}
private void stopButton_Click(object sender, EventArgs e)
{
timer1.Stop();
}
private void timer1_Tick(object sender, EventArgs e) …
Run Code Online (Sandbox Code Playgroud) 我正在使用带有WebBrowser控件的MSHTML,因为它让我可以访问WebBrowser没有的东西,例如文本节点.我在这里和网上看过几篇帖子,人们说你必须调用ReleaseComObject
你引用的每个COM对象.所以,说我这样做:
var doc = myBrowser.Document.DomDocument as IHTMLDocument2;
我需要发布doc
吗?如何body
在此代码中:
var body = (myBrowser.Document.DomDocument as IHTMLDocument2).body;
RCW包装的这些对象是否会在没有更多引用的情况下立即释放它们?如果没有,最好使用终结器(而不是使用Dispose)为每个人创建一个包装器,一旦垃圾收集器启动就会释放它们(这样我就不用担心了处理他们)?
问题是,我的应用程序有内存泄漏,我相信这与此有关.根据ANTS内存分析器,其中一个函数(在许多其他恰好使用MSHTML对象的函数中)持有对Microsoft.CSharp.RuntimeBinder.Semantics.LocalVariableSymbol
第2代中使用内存的对象顶部对象的一组对象的引用,这个是:
internal static string GetAttribute(this IHTMLDOMNode element, string name)
{
var attribute = element.IsHTMLElement() ? ((IHTMLElement)element).getAttribute(name) : null;
if (attribute != null) return attribute.ToString();
return "";
}
Run Code Online (Sandbox Code Playgroud)
不知道这里有什么问题,因为attribute
它只是一个字符串.
这是ANTS分析器的实例保留图上显示的另一个函数(我添加了一堆FinalReleaseComObject
s但仍然显示):
private void InjectFunction(IHTMLDocument2 document)
{
if (null == Document) throw new Exception("Cannot access current document's HTML or document is not an HTML.");
try
{ …
Run Code Online (Sandbox Code Playgroud) 我有这两种方法来获取当前的旅行日志条目并转到通过调用GetTravelLogEntry
方法检索的日志条目:
public static ITravelLogEntry GetTravelLogEntry(WebBrowser webBrowser)
{
int HRESULT_OK = 0;
SHDocVw.IWebBrowser2 axWebBrowser = (SHDocVw.IWebBrowser2)webBrowser.ActiveXInstance;
IServiceProvider psp = axWebBrowser as IServiceProvider;
if (psp == null) throw new Exception("Could not get IServiceProvider.");
IntPtr oret = IntPtr.Zero;
int hr = psp.QueryService(ref SID_STravelLogCursor, ref IID_ITravelLogStg, out oret);
if ((oret == IntPtr.Zero) || (hr != HRESULT_OK)) throw new Exception("Failed to query service.");
ITravelLogStg tlstg = Marshal.GetObjectForIUnknown(oret) as ITravelLogStg;
if (null == tlstg) throw new Exception("Failed to get ITravelLogStg");
ITravelLogEntry ptle = null; …
Run Code Online (Sandbox Code Playgroud) 以下MessageBox.Show
调用显示"内部".这是一个错误吗?
private void Throw()
{
Invoke(new Action(() =>
{
throw new Exception("Outer", new Exception("Inner"));
}));
}
private void button1_Click(object sender, EventArgs e)
{
try
{
Throw();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); // Shows "Inner"
}
}
Run Code Online (Sandbox Code Playgroud) 我是java/android的新手,所以我希望这是一个很容易解决的问题.
我已经使用libGDX的设置创建了一个项目,然后我将其导入Android Studio.我不知道Supplier
接口只适用于Java 8,并在核心模块中使用它,据我所知,它编译成一个由所有android/html/desktop/ios版本的游戏共享的库.桌面版本运行正常(我安装了Java 8),但我的Android应用程序崩溃了一个NoClassDefFoundError
错误(BTW,错误消息显示我写的类的名称,而不是Supplier
,但错误消失了,一旦我删除每一个Supplier
当我添加它们时引用并返回,所以显然错误消息不显示实际的问题类).
如果我尝试Supplier
在我的android模块中使用它,它甚至不会让我导入该类,因此它知道它不支持该Java版本,但它很高兴让我在核心模块中使用它而没有任何警告.我确定删除引用Supplier
将解决问题,但如果我无意中使用任何Java 8功能,此修复可能会导致运行时错误,因此不是解决问题的好方法.
我不知道项目在哪里设置使用Java 8,似乎有一堆.gradle,.xml和.iml文件显然都与配置有关.这是我build.gradle
在核心模块中的文件:
apply plugin: "java"
sourceCompatibility = 1.6
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceSets.main.java.srcDirs = [ "src/" ]
eclipse.project {
name = appName + "-core"
}
Run Code Online (Sandbox Code Playgroud)
sourceCompatibility = 1.6
当我将鼠标悬停在它上面时,Android工作室显示该行显示为灰色并显示"未使用分配".所以这可能是问题的一部分.
我的core.iml
文件也包含这一行:
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
Run Code Online (Sandbox Code Playgroud)
另外,这是core
根build.gradle
文件中的部分:
project(":core") {
apply plugin: "java"
dependencies {
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我应该改变什么来阻止它让我在我的核心项目中使用Java 8?