既然.NET CLR 4.0支持并行(SxS)操作,现在应该可以在托管代码中编写shell扩展.我试过这个并成功编写了一个实现IPropertyStore,IInitializeWithStream和IPropertyStoreCapabilities的Property Handler.
处理程序工作正常,并在通过资源管理器浏览文件时按预期调用.它还可以在预览面板和文件属性"详细信息"面板中显示自定义属性.
但是,当我尝试在预览面板中编辑属性,然后单击"保存"时,出现"正在使用文件"错误,指出该文件在Windows资源管理器中已打开.
一些花絮:
那么我需要更改(或设置在注册表中)以使属性保存工作?
更新:
感谢Ben,我已经开始工作了."困难部分"(至少对我来说)是理解COM互操作永远不会在我的PropertyHandler上调用Dispose或Finalize.这使我处理的文件保持打开状态,直到GC运行.
幸运的是,"属性处理程序协议"的作用是,当为ReadValue()调用IInitializeWithSream.Initialize()时,streamMode是ReadOnly,当为SetValue()调用它时,streamMode是ReadWrite,并且将调用Commit()在末尾.
int IInitializeWithStream.Initialize( IStream stream, uint grfMode )
{
_stream = stream;
_streamMode = (Stgm)grfMode;
Load();
// We release here cause if this is a read operation we won't get called back,
// and our finializer isn't called.
if ( ( _streamMode & Stgm.ReadWrite ) != Stgm.ReadWrite )
{
Marshal.ReleaseComObject( _stream );
_stream = null;
}
return HResult.S_OK;
}
int IPropertyStore.Commit()
{
bool result = false;
if …Run Code Online (Sandbox Code Playgroud) 当我调试托管的多线程代码时,我正处于Main\UnitTestRunner线程的断点处并偶尔开始单步调试,调试器将切换到另一个线程并开始踩它的代码.我怎么能阻止这个?
如果重要的话,使用VS2010 + Resharper 5.1.
更新1:
在单步(F10)命令之后仔细查看堆栈会显示在调试器决定停止执行之前实际执行了许多(10-30)步骤.
这种情况经常发生,使调试几乎不可能.这与汉斯提到的问题非常类似.
更新2:
我在Microsoft Connect上提交了一个错误.如果你也遇到这个问题,请"upvote".
更新3:
由M $确认为在下一个"服务版本"中修复的错误.解决方法是如所描述的单元测试定位到.NET 3.5 这里.