小编mai*_*n--的帖子

永远不会执行加载项事件

我使用"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)

但无论我做什么,我的处理程序都不会执行!

我瞎了吗?我是否必须做任何其他事情来注册这些处理程序或为什么它不起作用?

c# events add-in envdte visual-studio-2012

12
推荐指数
1
解决办法
1653
查看次数

为什么会导致CS0695?

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,因此既不是TInTOut不可能object,对吧?那么为什么编译器会认为PipelineElement<object, object>并且PipelineElement<TIn, TOut>可以变得相同呢?

编辑:是的,完全可以多次实现相同的通用接口:

public interface MyInterface<A> { }
public class …
Run Code Online (Sandbox Code Playgroud)

c# generics compiler-errors

10
推荐指数
1
解决办法
666
查看次数

[[noreturn]]函数指针

当我使用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)

但是没有独立于编译器的解决方案吗?

c++ function-pointers clang c++11 noreturn

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

如何将所有字段默认值的类型反序列化为None?

我必须反序列化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)

json rust serde serde-json

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

使用JNI调用API创建java7 JVM

我们在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

c++ java-native-interface java-7

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

穷举整数匹配

我试着穷尽地匹配这样的整数:

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仍然需要明显无法到达的_手臂?

rust

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

在当前进程中获取JavaVM*的所有实例?

这仅适用于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

c++ java windows java-native-interface

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