小编Pau*_*ano的帖子

定位框架真正意味着什么,以及如何最大化兼容性?

问候所有,

自从我第一次开始用C#编码以来,这让我很困惑.我的目标是创建一个程序集,该程序集将在用户拥有的最新.NET框架上运行,无论可能是什么.我不想要安装.NET 4,但是如果用户拥有它,我想使用它,更重要的是,如果用户只有 .NET 4而且下面没有任何内容,我希望它仍然有用.我开始怀疑这甚至不可能.

当我在Visual Studio中更改"目标框架"时,我真的不明白我在选择什么.这是否意味着"将与此版本兼容"?或者"只与这个版本兼容"?到目前为止似乎是后者; 我在虚拟机中的测试表明.NET 4目标程序集在没有.NET 4的情况下失败,而.NET 3.5目标程序集在没有.NET 3.5的情况下失败.有没有办法设置这个,所以我可以实现最大的兼容性?

更新:为了澄清,我有一个针对.NET 2的程序.这里的海报似乎表明它应该加载.NET 4.但是在只有.NET 4且之前没有任何东西的环境中,它无法加载.

UPDATE2:好的,想通了,但它比这里的海报似乎要复杂得多.我正在打开一个不同的问题来讨论错综复杂的问题,但简短的版本是,<supportedRuntime version="v4.0" />如果你想在.NET 4上运行非.NET 4程序集,你需要一个app.config .如果没有它,它们将无法加载.

.net c# compatibility assemblies backwards-compatibility

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

在一个配置中编译x86和x64?

问候所有,

我正在使用VS 2010中的C#解决方案.现在,由于我的目标是AnyCPU,当我想构建我的安装程序时,我可以选择Release模式并点击构建,一切都为我完成.但是,很快我就不得不在解决方案中添加一个C++ DLL项目来完成一些低级的东西.为了避免为x86和x64提供两个不同的下载链接,我想在我的安装程序中包含这两个版本.但是,如果我必须为x86和x64分别配置,那将非常烦人.我必须建立一个,然后另一个,然后打包它.有没有什么方法可以让Visual Studio在发布模式中编译C++项目的x86和x64版本?

64-bit visual-studio-2010 visual-studio

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

API挂钩COM对象函数?

问候StackOverflowians,

正如此处所发现的,Windows 7具有一个错误,在该错误中,Windows资源管理器实例不会触发DISPID_BEFORENAVIGATE2事件.此事件允许在即将进行导航时通知shell扩展,并且(对我来说最重要的)有机会取消导航.我已经找了很长时间的解决方法,我想我找到了一个.但是,我想对它的安全性有一些看法.

我最近一直在玩API挂钩,我已经用它来为我的扩展程序挂钩一些函数了.我注意到IShellBrowser中有一个控制导航的功能.起初我以为你不能挂钩这样的东西,但在阅读COM对象布局后,我意识到应该可以通过从任何活动实例的vtable中抓取正确的函数指针来实现.果然,它像梦一样.设置挂钩后,所有资源管理器窗口中的所有导航都会在我的绕行功能中运行,我可以根据目标pidl决定是否拒绝它们.

所以我的问题是,我有什么理由不这样做吗?我从来没有听说过用于挂钩COM对象函数的API钩子.是否存在不起作用的情况?危险吗?(至少比常规的API挂钩更多)

相关代码如下.我正在使用MinHook,这是一个简约的挂钩库,它使用了经过验证的蹦床功能方法.

typedef HRESULT (WINAPI *BROWSEOBJECT)(IShellBrowser*, PCUIDLIST_RELATIVE, UINT);
HRESULT WINAPI DetourBrowseObject(IShellBrowser* _this, PCUIDLIST_RELATIVE pidl, UINT wFlags);
BROWSEOBJECT fpBrowseObject = NULL;
BROWSEOBJECT ShellBrowser_BrowseObject = NULL;

bool Initialize() {
    if(MH_Initialize() != MH_OK) {
        return false;
    }

    // Get a reference to an existing IShellBrowser.  Any instance will do.
    // ShellBrowser enum code taken from The Old New Thing
    IShellWindows *psw;
    BOOL fFound = FALSE;
    if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, …
Run Code Online (Sandbox Code Playgroud)

c++ com hook vtable api-hook

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

如何检查flock执行的命令的退出代码?

问候所有.我正在设置一个cron作业来执行一个bash脚本,我担心下一个可能会在前一个脚本结束之前启动.一个小小的谷歌搜索显示,一种流行的解决方法是flock命令,使用方式如下:

flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
    echo "Previous script is still running!  Can't execute!"
fi
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是,如果我想检查退出代码,我该怎么办myscript.sh?无论退出代码返回将被覆盖flock的,所以我不知道,如果它成功,或不执行的方式.

bash cron exit-code file-locking flock

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

有什么方法可以避免在只需要几个方法时创建一个巨大的C#COM接口包装器?

问候所有,

我正在开发一个C#程序,它需要能够在Windows 7 Explorer的新ItemsView控件中获取热门项目的索引.幸运的是,Microsoft通过查询控件的自定义属性,提供了一种通过UI自动化实现此目的的方法.

不幸的是,System.Windows.Automation命名空间莫名其妙地似乎没有提供查询自定义属性的方法!这使我不得不完全抛弃C#Automation命名空间并仅使用非托管COM版本.一种方法是将所有自动化代码放在单独的C++/CLI模块中,并从我的C#应用​​程序中调用它.但是,如果可能的话,我想避免使用此选项,因为它会为我的项目添加更多文件,而且我不得不担心32/64位问题等等.

另一个选择是使用ComImport属性来声明相关接口并通过COM-interop完成所有操作.这就是我想做的.但是,相关的接口,如IUIAutomation和IUIAutomationElement,正在变得非常大.他们总共有数百种方法,参考吨和大量的接口(我假设我还必须声明),几乎所有这些都是我永远不会使用的.我不认为UI自动化接口也在任何类型库中声明,所以我不能使用TLBIMP.

有什么方法可以避免手动将bajillion方法签名转换为C#而只是声明我实际需要的十个左右的方法吗?我看到C#4.0添加了一个新的"动态"类型,可以缓解COM互操作; 那与我的问题有关吗?

谢谢

c# com interface com-interop ui-automation

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

Decyphering未记录的COM接口

我有一个指向实现未记录的接口的COM对象的指针.我真的非常希望能够使用所述界面.我所拥有的只是IID.主软件分析师Geoff Chappell在他的网站上记录了大量这些未记录的COM接口; 以IListView为例.不知何故,他甚至设法获得了函数名称和签名.这样的事情怎么可能呢?他们猜对了吗?

有人能指出我正确的方向,我会怎么做这样的事情?我知道使用任何无证件的风险.

详细说明,我感兴趣的对象是ExplorerFrame.dll的臭名昭着的未记录的ItemsView.通过在CoCreateInstance上设置API挂钩,我可以看到该对象是使用某个未记录的IID作为其主接口创建的.我假设这是操纵控件的界面,因此我有兴趣找出它的成员.

com interface

2
推荐指数
1
解决办法
865
查看次数

如何在 C# 中定义 TBBUTTON 结构?

问候大家,

TBBUTTON 结构在 MSDN 上定义如下:

typedef struct {
  int       iBitmap;
  int       idCommand;
  BYTE      fsState;
  BYTE      fsStyle;
#ifdef _WIN64
  BYTE      bReserved[6];
#else 
#if defined(_WIN32)
  BYTE      bReserved[2];
#endif 
#endif 
  DWORD_PTR dwData;
  INT_PTR   iString;
} TBBUTTON, *PTBBUTTON, *LPTBBUTTON;
Run Code Online (Sandbox Code Playgroud)

我需要使用这个结构在 C# 中做一些互操作。我如何复制这个怪物,以便在为 AnyCPU 编译时正确定义它?谷歌显然充满了危险的错误信息!

c# 64-bit interop

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