我使用"Visual Studio的加载项"向导来创建一个新的Addin项目,现在,我正在尝试添加一些事件处理程序:
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
_applicationObject.Events.BuildEvents.OnBuildBegin += BuildEvents_OnBuildBegin;
_applicationObject.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone;
_applicationObject.Events.SelectionEvents.OnChange += SelectionEvents_OnChange;
_applicationObject.Events.DocumentEvents.DocumentOpened += DocumentEvents_DocumentOpened;
_applicationObject.Events.DocumentEvents.DocumentSaved += DocumentEvents_DocumentSaved;
}
Run Code Online (Sandbox Code Playgroud)
但无论我做什么,我的处理程序都不会执行!
我瞎了吗?我是否必须做任何其他事情来注册这些处理程序或为什么它不起作用?
public interface PipelineElement<in TIn, out TOut>
{
IEnumerable<TOut> Run(IEnumerable<TIn> input, Action<Error> errorReporter);
}
public interface Stage
{
}
public abstract class PipelineElementBase<TIn, TOut> : PipelineElement<object, object>,
PipelineElement<TIn, TOut> where TIn : Stage where TOut : Stage
{
IEnumerable<object> PipelineElement<object, object>.Run(IEnumerable<object> input, Action<Error> errorReporter)
{
return this.Run(input.Cast<TIn>(), errorReporter).Cast<object>();
}
public abstract IEnumerable<TOut> Run(IEnumerable<TIn> input, Action<Error> errorReporter);
}
Run Code Online (Sandbox Code Playgroud)
object没有实施Stage,因此既不是TIn也TOut不可能object,对吧?那么为什么编译器会认为PipelineElement<object, object>并且PipelineElement<TIn, TOut>可以变得相同呢?
编辑:是的,完全可以多次实现相同的通用接口:
public interface MyInterface<A> { }
public class …Run Code Online (Sandbox Code Playgroud) 当我使用clang(version 3.4 (trunk 194574))编译时:
typedef void (* FunctionThatNeverReturns [[ noreturn ]])();
Run Code Online (Sandbox Code Playgroud)
我明白了:
error: 'noreturn' attribute only applies to functions and methods
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶,因为它与旧版本的clang完美搭配.
那么如何定义指向[[ noreturn ]]函数的指针呢?
我需要这个因为我在函数内部调用函数指针[[ noreturn ]],如果函数指针没有标记为noreturn,它显然会产生警告.
哦,这有效:
typedef void (* FunctionThatNeverReturns [[ gnu::noreturn ]])();
Run Code Online (Sandbox Code Playgroud)
但是没有独立于编译器的解决方案吗?
我必须反序列化JSON blob,在某些地方,缺少整个对象被编码为具有相同结构的对象,但其所有字段都设置为默认值(空字符串和零).
extern crate serde_json; // 1.0.27
#[macro_use] extern crate serde_derive; // 1.0.78
extern crate serde; // 1.0.78
#[derive(Debug, Deserialize)]
struct Test<T> {
text: T,
number: i32,
}
#[derive(Debug, Deserialize)]
struct Outer {
test: Option<Test<String>>,
}
#[derive(Debug, Deserialize)]
enum Foo { Bar, Baz }
#[derive(Debug, Deserialize)]
struct Outer2 {
test: Option<Test<Foo>>,
}
fn main() {
println!("{:?}", serde_json::from_str::<Outer>(r#"{ "test": { "text": "abc", "number": 42 } }"#).unwrap());
// good: Outer { test: Some(Test { text: "abc", number: 42 }) }
println!("{:?}", serde_json::from_str::<Outer>(r#"{ …Run Code Online (Sandbox Code Playgroud) 我们在java 7中有一个类,需要从本机代码加载它.我已经使用java 6和JNI但java 6无法加载该类.所以我在我的VC项目中安装了新的JDK,更改了包含目录和链接引用等等.直到我想从JNI启动jre7:
JNI_CreateJavaVM采用vm_args.version参数中的java版本,但没有比1.6更新版本的定义.
JavaVMInitArgs vm_args;
...
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 2;
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
Run Code Online (Sandbox Code Playgroud)
调用FindClassjava7类显然会产生UnsupportedClassVersionError.
问题:我如何创建一个java7 JVM JNI_CreateJavaVM?
我试着穷尽地匹配这样的整数:
fn main() {
for test in range(std::u8::MIN, std::u8::MAX) {
match test {
0x00..0xff => {},
}
}
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨:
all.rs:3:9: 6:10 error: non-exhaustive patterns: `_` not covered [E0004]
all.rs:3 match test {
all.rs:4 0x00..0xff => {},
all.rs:5 }
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)
但是,涵盖了所有可能的值.快速检查确认了这一点:
fn main() {
for test in range(std::u8::MIN, std::u8::MAX) {
match test {
0x00..0xff => {},
_ => fail!("impossible"),
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在编译并运行它:
$ rustc all.rs
$ ./all
$
Run Code Online (Sandbox Code Playgroud)
涵盖所有可能的值,为什么rustc仍然需要明显无法到达的_手臂?
这仅适用于Windows.
JNI是否提供任何返回JavaVM*调用进程的所有实例的API ?
考虑以下场景,将C++ dll注入java.exe进程.现在的问题是,C++ DLL如何JavaVM*在其运行的进程中找到当前实例?
据我所知,所有JNI调用API都需要一个JNIEnv只能从JavaVM*右边获取的对象 ?http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html
传统的获取方式JavaVM*是通过,JNI_OnLoad但由于我不是在编写一个由Java使用的本机库,所以我认为不会这样做. http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html