小编Str*_*ill的帖子

从构造函数调用方法

请原谅任何小的语法错误或诸如此类的错误,我正在通过Jitsi模块遇到这个问题并且不熟悉Java,想要确认发生了什么以及为什么以及如何修复它.

 public abstract class A
{
  public A()
  {
    this.load();
  }

  protected void load()
  {

  }
}

public class B extends A
{
  private String testString = null; 

  public B()
  {
    super();
  }

  @Override
  protected void load()
  {
    testString = "test";
  }
}
Run Code Online (Sandbox Code Playgroud)

应用程序在使用按名称加载类方法创建类B的实例时执行此操作:

  • 在B类中调用重写的load()
  • 初始化变量(根据调试器调用"private string testString = null"),将它们清零.

这是预期的Java行为吗?什么可能导致这个?它是在1.7 JDK上运行的Java 1.6应用程序.

java constructor class

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

高性能事件日志

所以我一直在尝试各种方法来批量获取事件日志数据(1000多条记录/秒).

我需要能够过滤旧日志的东西,现在我存储最后记录的事件记录ID并检索事件ID大于那个的所有记录....

我已经尝试过EventLogQuery/EventLogReader,这个工作很快,除非我想拉消息数据,为了获得安全日志的格式化消息,我需要调用EventLogRecord.FormattedMessage(),这使我的日志速度达到约150 /秒具有易于格式化的日志,更复杂的日志更糟糕.

我已经尝试过System.Diagnoistics.EventLog,这不允许我构建过滤器,所以每次运行它都必须加载所有事件日志,然后我可以解析任何重复项(从上次扫描).我有一个在过去两天内有200万个事件日志的服务器,由于这个内存使用情况变得很糟糕,所以这是不行的.

我已经尝试过使用System.Management.ManagementObjectCollection的WMI,它有过滤功能,可以从安全事件日志中快速提取消息数据(接近~1000 /秒),但是它会达到大约50/60k并开始拖动它的脚,做到大约1-2 /秒,最终我会得到一个配额违规错误.:(

所以要么:

有没有办法避免配额违规错误,或者我是否想使用其他方法以此速度提取事件日志?

编辑:

我写了一篇博文,详细介绍了我对此的了解:

http://www.roushtech.net/2013/10/30/high-performance-event-log-reading/

主要是:WINAPI是你最好的选择,要么写C++/CLR,要么使用PInvoke.

c# wmi winapi event-log

11
推荐指数
1
解决办法
6275
查看次数

JNA捕捉异常

我有一个关于处理JNA下库引发异常的快速问题...

当我在底层本机代码中抛出异常时,JNA会收到无效的内存访问错误.我假设这是因为C库不能通过它的堆栈抛出异常(它实际上是C++/CLR但是有C输出)?那么有没有真正的方法来报告Java的异常?或"它应该工作",我只是做了一些令人难以置信的错误?

DllExport void Initialize(char* dir)
{
    throw gcnew System::Exception("Testing");
}
Run Code Online (Sandbox Code Playgroud)

Java能够检测到这些抛出的异常会很好,我想我实际上可以考虑将内存指针传递给我的所有C导出并检查它们是否为null,但看起来像是一种迂回的方式.

java exception jna

8
推荐指数
2
解决办法
1813
查看次数

带缓存的NuGet服务器

我有一个构建服务器,可以在每个构建中提取nuget包,并且目前在内部部署了NugetGallery用于自定义包.现在,像没有明天一样吃带宽(不是很大,但我希望善待并为我们做得更快).

所以我想自动镜像repos并缓存它们.

到目前为止,我有几个选择:MyGet,这是一个仅限云的产品(所以没有),以及Proget(我倾向于).我还缺少自动镜像的其他选项吗?

nuget nuget-server nugetgallery myget proget

8
推荐指数
2
解决办法
1769
查看次数

恒定时间比较

一个相对简单的问题:

似乎是C#不附带烤入恒定时间比较方法或扩展,为什么不呢?当然这是一个简单的算法,但它似乎应该包括在内.

通常不建议您编写任何自己的加密代码,但似乎没有任何库用于此类目的,我是否遗漏了一些?

请参阅以下算法:http://codahale.com/a-lesson-in-timing-attacks/

.net algorithm cryptography

8
推荐指数
1
解决办法
1854
查看次数

创建新的会话ID(无缝ID传输)

因此,在登录/更改访问级别/等之后,我遇到了一个实现会话ID滚动的有趣问题.

在登录时我正在尝试使用SessionIDManager生成新的会话ID,但是这只会更改cookie标头,它不会在HttpContext中交换会话,因此我会向会话添加其他详细信息(各种详细信息)将用户绑定到会话ID),他们立即迷路(更不用说旧会话被遗弃).

为了防止会话劫持(通过存储主要的非SSL通信)和会话固定,我们应该在登录时生成新的会话ID,但Microsoft似乎不允许您这样做(grr,这么多的只读变量和没有构造函数的密封类).我可以只迁移后端SQL中的所有数据,但这似乎有点"肮脏的黑客".

关于如何正确地做到这一点的任何想法?

编辑:

我发现的实现:

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
Run Code Online (Sandbox Code Playgroud)

会话仍然是旧会话,因此在下一页上,所有更改都将丢失.

SessionIDManager在SaveSessionID之后不返回会话对象,因此我无法向刚创建的会话添加详细信息.在下一页加载我可以,但旧会话现在无法访问(并放弃,但即使它没有被放弃...).

HttpContext.Session是只读的,即使它不是,HttpSessionState也没有构造函数.

编辑2:

ASP.NET中的会话修复

显然会话固定和劫持在此之前已经被讨论过了,答案是"微软似乎并不关心",实施的两阶段修复效果不佳.

.net c# asp.net session

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

JNA内存泄漏

鉴于此C++代码:

void LoadData(char** myVar)
{
    std:: string str("[Really Long String Here]");
    unsigned int size = str.length() + 1;
    *myVar = new char[size];
    strncpy(*myVar, str.c_str(), size);
}
Run Code Online (Sandbox Code Playgroud)

而这个JNA Java:

Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
Run Code Online (Sandbox Code Playgroud)

我有内存泄漏,据我所知,getPointer(0)应该创建一个应该在finalize()上释放的指针对象,但它似乎不是.

我错过了什么吗?这似乎符合规范...我可以运行上面的函数,没有C++中的泄漏.

我在一个循环中调用Java代码来测试泄漏,我尝试了暂停,并手动调用GC,它也会以相当快的速度膨胀到千兆字节.

我已经对这个问题猛烈抨击了几天了,而且想要释放内存这么简单的东西很糟糕.据我所知,如果我有地址,我只能用Java手动释放内存. ,但我看不出我是怎么做到的.

编辑:

没关系,我甚至认为有一种方法可以手动免费通过JNA而不扩展它...

c c++ java jna

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

Java .NET互操作

好吧,我一直在挖掘这一段时间,我正在寻找输入.

我需要一个可以加载和卸载本机库的Java应用程序,这很简单,C/C++/Java/Scripts/Executables /等.使用JNI和其他内置功能并不是真正的问题.

但是,我需要能够加载.NET库,这一直是疯狂的沮丧.我的第一个注意事项是使用JNI并调用C++包装器,如下所示:

Java的:

this.Lib = (LibHandler)Native.loadLibrary("MyLib", LibHandler.class);
Run Code Online (Sandbox Code Playgroud)

CPP:

#include <jni.h>
#using <MyLibCSharp.dll>
#include <vcclr.h>
#include <msclr\marshal.h>

using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
using namespace System;

extern "C" 
{
    JNIEXPORT jstring JNICALL Java_Test(JNIEnv * env)
    { 
        marshal_context ^ context = gcnew marshal_context();
        const char* str4 = context->marshal_as<const char*>(CSharp::Class1::Test());

        jstring js = env->NewStringUTF(str4);


        return js;
    }

    JNIEXPORT jstring JNICALL Java_Test2(JNIEnv * env, jobject jobj)
    { 
        marshal_context ^ context = gcnew marshal_context();
        const char* str4 = context->marshal_as<const char*>(CSharp::Class1::Test());

        jstring js = …
Run Code Online (Sandbox Code Playgroud)

.net c# java com dll

6
推荐指数
2
解决办法
6818
查看次数

Nunit测试MVC网站

我试图对我拥有的MVC站点进行单元测试时遇到了一些问题:我需要运行很多ASP.NET环境(生成httpcontexts,会话,cookie,成员资格等)才能完全测试一切.

即使要测试一些较少前端的东西需要会员资格才能正常工作,并且让这一切都被手工欺骗是很挑剔的.

有没有办法在NUnit测试中启动应用程序池?这似乎是最简单的方法.

c# asp.net testing nunit

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

Java JNIEnv分段错误

我正在使用它们之间的本机库来做一些Java < - > .NET互操作代码,到目前为止事情进展顺利.

但由于某些原因,我无法在JNIEnv下运行任何方法.

System::String^ JNIStringToNet(JNIEnv * env, jstring js)
{
    const char *buf = env->GetStringUTFChars(js, 0); // segfault
Run Code Online (Sandbox Code Playgroud)

现在我可以来回传递变量并进行所有其他类型的通信,所以我认为我没有正确地初始化这个或什么.

我正在加载它:

this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);     
Run Code Online (Sandbox Code Playgroud)

(我更喜欢Native.loadLibrary,因为它似乎让我可以更轻松地完成更多工作,例如多个库之间的类共享和取消并从动态JVM中取出它).

编辑:

严重的任何方法:

std::cout << "Getting version:" << std::endl;
std::cout << env->GetVersion() << std::endl;
Run Code Online (Sandbox Code Playgroud)

获取版本:

(段错误)

关于JNIEnv的任何想法会对每种方法都进行分段错误吗?这应该由JVM设置,对吗?

编辑2:

这是一个Java应用程序,它调用一个C++库,它将与.NET库接口(所以它是一个CLR编译的C++库,如果这有什么不同),限制任何我甚至不调用.NET DLL的外部因素但只是转换出来的字符串(或者很好......尝试).

例如来自Java:

this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.myCPPMethod(); // Segmentation fault during this call, JVM crashes.
Run Code Online (Sandbox Code Playgroud)

好奇,如果它是导致它的CLR:禁用clr编译并剥离CLR相关的所有内容,仍然这样做.

编辑3:

得到它转储:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface jna

5
推荐指数
1
解决办法
1305
查看次数