2011-10-19 85 views
0

如果我有一个托管DLL和一个非托管资源管理器扩展,是否有可能以某种方式加载托管DLL,而无需将CLR拖入资源管理器的进程空间?如何在不加载CLR的情况下使用托管DLL?

我知道编写一个受管理的浏览器扩展是一个不允许的,因为它将CLR加载到资源管理器中,并导致发生使用CLR的其他插件/扩展的问题,但我有一些我想要的托管代码在我的扩展中使用。我怎样才能避免这个问题?

+3

托管的DLL运行使用CLR。使用没有CLR的托管DLL就像试图在没有空气的情况下飞行一架飞机。总之:这是不能做到的。你将不得不使用某种远程方式来获得所需的结果。 –

+0

.NET 4.0中的进程内并行支持旨在解决此问题。具有讽刺意味的是,微软后来宣称使用它来编写一个不受支持的用法。那么,这不像你会得到很多支持让一个进程外解决方案工作。 http://www.google.com/url?sa=t&rct=j&q=jialiang%20shell%20extensions&source=web&cd=1&ved=0CCIQFjAA&url=http%3A%2F%2Fgeekswithblogs.net%2FJialiang%2Farchive%2F2010%2F09%2F16% 2Fwriting-windows-shell-extension-with-.net-4 --- part-1.aspx&ei = -xWfToX9EuOSiQLD1Nxl&usg = AFQjCNFlQ4Hz-QCRfPYYHuCtmQbsokjVHQ&cad = rja –

+0

有趣的问题。如果这是可能的,为什么我们会使用“CLR”?要挑剔,实际上,你可以*加载*它,但不*执行*它:-) –

回答

1

不是一个理想的答案,而是一条可以考虑的路线。编写一个非托管代理并使用命名管道/其他IPC调用托管代码服务。这是一个有点俗气和气味,但如果你被卡住..

+0

说实话,这是我试图通过托管来实现的IPC。如果我要走这条路,我不妨直接沟通。我努力寻找一种合适的IPC方法来在C#服务和C++扩展之间进行通信。 – JWood

+0

你有没有使用命名管道?这在理论上与在非托管代码中使用漂亮的托管包装器和ReadFile/WriteFile一样简单。当然,您需要(de-)seralise自己。 –

+0

这就是问题所在,我使用WCF作为命名管道服务器,它使用未记录的方法命名管道以及序列化。我认为共享内存是我研究DCOM之后最好的选择,但是我之前从未使用过共享内存,因此它将成为学习曲线。 – JWood

0

您可以随时等待Windows 8的WinRT是完全非托管和API的语法是非常像.NET

+3

然后等到所有人升级。无论如何,Windows的所有早期版本都不受管理。 –

相关问题