1

我为教育目的创建了小型便携式库(参考,目标:Windows、Windows 8、Windows Phone 7.5)。我决定在我的小型 Windows 8 Metro 风格应用程序中使用它。不幸的是,当我从库中调用方法时,会引发异常:

应用程序调用了为不同线程编组的接口。

在以下行:

return Activator.CreateInstance(outputType, constructorArguments.ToArray());

解决方法outputTypetypeof(ClassFromMyMetroStyleApp)。库作为 dll 引用添加到项目中。

我能做些什么来解决这个问题?

编辑:方法是从 Metro Style App 解决方案中的 UnitTest 调用:

[TestClass]
public class ResolvingTypesTests
{
    /// <summary>
    /// The school context interface test.
    /// </summary>
    [TestMethod]
    public void SchoolContextTest()
    {
        var schoolContext = TypeService.Services.Resolve<ISchoolContext>();

        Assert.AreEqual(typeof(SchoolCollection), schoolContext.GetType());
    }
}

其中TypeService是静态类,Services是 IResolvable 类型的静态属性(接口由库提供)。

服务属性:

/// <summary>
    /// The resolvable.
    /// </summary>
    private static IResolvable resolvable;

    /// <summary>
    /// Gets the type services.
    /// </summary>
    public static IResolvable Services
    {
        get
        {
            if (resolvable == null)
            {
                var builder = new ContainerBuilder();
                builder.Register();
                resolvable = builder.Build();
            }

            return resolvable;
        }
    }
4

3 回答 3

0

当您在一个线程中使用在另一个线程中创建的某些对象(通常是 UI 对象)时,您可能会在单线程单元中遇到此错误。

于 2013-05-01T13:54:00.110 回答
0

找到了解决方案(感谢 Hans Passant 提供线索!)需要在测试方法中添加一个属性:

[UITestMethod]
于 2013-05-02T16:52:23.827 回答
-1

不仅因为跨线程访问,还有性能原因,不鼓励使用 Activator。 http://bloggingabout.net/blogs/vagif/archive/2010/04/02/don-t-use-activator-createinstance-or-constructorinfo-invoke-use-compiled-lambda-expressions.aspx

这里作者提供了 Activator 和使用 Lambda 表达式实例化对象的比较。我为您将代码包装在一个方法中。尝试这个

public object CreateObject(Type type)
    {

        var ctor = type.GetConstructor(new Type[]{});
        // Make a NewExpression that calls the ctor with the args we just created
        NewExpression newExp = Expression.New(ctor, null);

        // Create a lambda with the New expression as body and our param object[] as arg
        LambdaExpression lambda = Expression.Lambda(newExp, null);

        // Compile it
        var compiled = lambda.Compile();
        if (compiled != null)
        {
        }
        return compiled.DynamicInvoke();
    }
于 2013-05-01T14:06:37.033 回答