小编Jua*_*uan的帖子

如何在C#中创建一个我可以像字符串一样初始化的类?

我希望能够像初始化字符串一样初始化类:

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)

.net c#

7
推荐指数
2
解决办法
235
查看次数

是否可以确定WebBrowser是否正在导航?

我正试图找到一种方法让我的程序知道WebBrowser何时导航以及何时不导航.这是因为程序将通过将在文档中注入的JavaScript与加载的文档进行交互.我没有任何其他方式知道它何时开始导航而不是处理导航事件,因为不是我的程序,而是将通过与文档交互进行导航的用户.但是,当DocumentCompleted发生时并不一定意味着它已完成导航.我一直在谷歌搜索,发现两个伪解决方案:

  1. 在事件中检查WebBrowser的ReadyState属性DocumentCompleted.这里的问题是,如果没有这个文件,但该文件加载的框架中,ReadyStateCompleted即使没有完成主文档.

  2. 为了防止这种情况,他们建议,看是否网址参数传递到DocumentCompleted比赛地址WebBrowser.这样我就会知道DocumentCompleted文档中的某些其他框架没有调用它.

2的问题在于,正如我所说,我必须知道页面导航的唯一方法是处理Navigating(或Navigated)事件.因此,例如,如果我在Google地图中并点击搜索,Navigating则会调用,但只是一个框架正在导航; 不是整个页面(在特定的Google案例中,我可以使用TargetFrameName属性WebBrowserNavigatingEventArgs来检查它是否是正在导航的帧,但帧并不总是有名称).所以在那之后,DocumentCompleted将被调用,但不会与UrlWebBrowserUrl属性相同,因为它只是一个导航的框架,所以我的程序将会永远导航它.

添加调用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)

.net c# browser webbrowser-control

7
推荐指数
1
解决办法
2548
查看次数

为什么我的所有异常消息现在以"越过本地/管理边界"结束

我正在搞乱调试选项,现在我所有的例外都是这样的

System.NullReferenceException越过了本机/托管边界.

有时候,当发生异常时,VS要求我打开一些.net .cs文件,好像我有源代码一样.我希望有一些"恢复默认值"按钮.知道我需要切换到什么才能使其正常工作?

visual-studio-2010 visual-studio

7
推荐指数
2
解决办法
5629
查看次数

从字符串中删除所有"隐形"字符?

我正在编写一个小类来读取文件中的键值对列表并写入Dictionary<string, string>.此文件将具有以下格式:

key1:value1
key2:value2
key3:value3
...
Run Code Online (Sandbox Code Playgroud)

这应该很容易,但是由于用户要手动编辑这个文件,我应该如何处理空格,制表符,额外的行跳转等等?我可以使用Replace删除空格和制表符,但是,是否还有其他"隐形"字符我缺少?

或者我可以删除所有不是字母数字的字符,":"和行跳转(因为行跳转是将一对与另一对分开),然后删除所有额外的行跳转.如果是这样,我不知道如何删除"all-except-some"字符.

当然我也可以查看"key1:value1:somethingelse"之类的错误.但是这样的东西并不重要,因为它显然是用户的错,我只会显示"无效格式"消息.我只是想处理基本的东西,然后把所有这些都放在try/catch块中以防万一其他出错.

注意:我根本不需要任何空格,即使在键或值内也是如此.

.net c# io serialization deserialization

7
推荐指数
3
解决办法
1万
查看次数

使用.NET WebClient模拟XmlHttpRequest

AFAIK XmlHttpRequest我可以使用该send方法下载和上传数据.但是WebClient有很多方法.我不想要所有的功能WebClient.我只是想创建一个模拟a的对象XmlHttpRequest,除了它没有XSS限制.我也不关心将响应作为XML或甚至现在作为字符串.如果我可以把它作为一个足够好的字节数组.

我以为我可以使用UploadData我的通用方法,但尝试使用它下载数据时失败,即使它返回响应.那么如何编写一个行为XmlHttpRequestsend方法类似的方法呢?

编辑:我在这里发现了一个不完整的类,它正是一个XmlHttpRequest模拟器.太糟糕了,整个代码都丢失了.

.net c# webclient xmlhttprequest winforms

7
推荐指数
2
解决办法
3万
查看次数

Web浏览器内存问题

我有一个.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)

.net webbrowser-control

7
推荐指数
1
解决办法
3005
查看次数

我是否绝对需要在每个MSHTML对象上调用ReleaseComObject?

我正在使用带有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分析器的实例保留图上显示的另一个函数(我添加了一堆FinalReleaseComObjects但仍然显示):

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)

c# com mshtml

7
推荐指数
1
解决办法
2202
查看次数

ITravelLogStg :: TravelTo失败,错误0x80004002

我有这两种方法来获取当前的旅行日志条目并转到通过调用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)

c# internet-explorer mshtml webbrowser-control

6
推荐指数
1
解决办法
372
查看次数

Control.Invoke展开外部异常并传播内部异常

以下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)

c# invoke winforms

6
推荐指数
1
解决办法
173
查看次数

libGDX设置允许我使用在Android中崩溃的Java 8

我是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)

另外,这是corebuild.gradle文件中的部分:

project(":core") {
    apply plugin: "java"


    dependencies {
        compile "com.badlogicgames.gdx:gdx:$gdxVersion"
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,我应该改变什么来阻止它让我在我的核心项目中使用Java 8?

java android gradle libgdx android-studio

6
推荐指数
1
解决办法
1452
查看次数