【发布时间】:2017-09-23 02:38:04
【问题描述】:
这是实现实际目标的一步,即将 Direct2D 与托管代码中的 GDI 混合,以更新在 上运行的旧版 Windows 窗体 应用程序.NET Framework 3.5(此时迁移到较新的 .NET 不实用)。
请参阅 How initialize Direct2D renderer into GDI context from managed code for older version of .NET Framework 了解此项目的开始。
我正在关注这个 C++ 文档:Direct2D/Programming Guide/How-to/How to Load a Bitmap from a File
特别是这个 C++:
HRESULT DemoApp::LoadBitmapFromFile(
ID2D1RenderTarget *pRenderTarget,
IWICImagingFactory *pIWICFactory,
PCWSTR uri,
UINT destinationWidth,
UINT destinationHeight,
ID2D1Bitmap **ppBitmap
)
{
IWICBitmapDecoder *pDecoder = NULL;
IWICBitmapFrameDecode *pSource = NULL;
IWICStream *pStream = NULL;
IWICFormatConverter *pConverter = NULL;
IWICBitmapScaler *pScaler = NULL;
HRESULT hr = pIWICFactory->CreateDecoderFromFilename(
uri,
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&pDecoder
);
其中需要IWICImagingFactory pIWICFactory,它指的是WIC(Windows 映像组件)中定义的COM 接口。
我的问题: 如何在 C# 中引用 IWICImagingFactory COM 对象?
或者是否有其他方法可以将位图导入 Direct2D?
(必须在 .NET 3.5 上运行并使用 WinForms,所以 Win2D 不是一个选项,AFAIK。WPF 解决方案也可能无济于事,因为它是一个 32 位应用程序,并且没有多少内存可用;我犹豫是否要添加其他技术。)
如果我们的应用在 .NET Framework 4.0 中,这项任务将很容易完成,因为我们可以使用包含 Direct2D+WIC 的 SharpDX;不幸的是,直到 v.3.0.0(需要 .NET 4.0)才将 Direct2D 添加到 SharpDX。
所以我试图从 SharpDX 源中提取工厂创建代码。
档案SharpDX.Direct2D1\WIC\ImagingFactory.cs:
using System;
namespace SharpDX.WIC
{
public partial class ImagingFactory
{
/// <summary>
/// Initializes a new instance of the <see cref="ImagingFactory"/> class.
/// </summary>
public ImagingFactory()
{
Utilities.CreateComInstance(WICImagingFactoryClsid, Utilities.CLSCTX.ClsctxInprocServer, Utilities.GetGuidFromType(typeof(ImagingFactory)), this);
}
}
}
我已经成功复制并构建了该代码使用的所有文件,除了一个参考:WICImagingFactoryClsid
这可以在 Mapping.xml 文件中找到:
<const from-guid="CLSID_WICImagingFactory" class="SharpDX.WIC.ImagingFactory" type="System.Guid" name="WICImagingFactoryClsid">new System.Guid("$1")</const>
我还没有尝试从源代码构建 SharpDX,以了解此文件如何生成可构建的类库;
我宁愿通过将最少需要的代码集成到我们的应用程序中来解决这个问题。
我不明白Mapping.XML 在做什么。我想手动编码这个 COM 接口参考。并且知道如何根据需要对其他 WIC 接口进行编码。或者了解如何生成此类接口,而无需构建所有 SharpDX。
【问题讨论】: