Я застрял в этой же проблеме и продолжил с J Ответом Поллака (потому что он мне кажется чище), но мне нужно что-то, что могло бы работать как в среде выполнения .NET 2.0, так и в 4.0.
Но когда я это сделал, у меня получилось ужасное MissingMethodException , потому что SafeCreateWindow больше не существует в среде выполнения .NET 4.0. Чтобы заставить код работать в обеих средах выполнения, я решил перехватить исключение MissingMethodException и вместо этого вызвать эквивалент в среде выполнения .NET 4.0, например:
public static IntPtr EnsureHandle(this WindowInteropHelper helper)
{
if (helper == null)
throw new ArgumentNullException("helper");
if (helper.Handle == IntPtr.Zero)
{
var window = (Window)typeof(WindowInteropHelper).InvokeMember(
"_window",
BindingFlags.GetField |
BindingFlags.Instance |
BindingFlags.NonPublic,
null, helper, null);
try
{
// SafeCreateWindow only exists in the .NET 2.0 runtime. If we try to
// invoke this method on the .NET 4.0 runtime it will result in a
// MissingMethodException, see below.
typeof(Window).InvokeMember(
"SafeCreateWindow",
BindingFlags.InvokeMethod |
BindingFlags.Instance |
BindingFlags.NonPublic,
null, window, null);
}
catch (MissingMethodException)
{
// If we ended up here it means we are running on the .NET 4.0 runtime,
// where the method we need to call for the handle was renamed/replaced
// with CreateSourceWindow.
typeof(Window).InvokeMember(
"CreateSourceWindow",
BindingFlags.InvokeMethod |
BindingFlags.Instance |
BindingFlags.NonPublic,
null, window, new object[] { false });
}
}
return helper.Handle;
}
Это позволило мне скомпилировать код с помощью .NET 3.5, но запустить его в .NET runtime 4.0 в системах, в которых установлена только более поздняя версия (а именно Windows 8 и выше).