none
windows 8 Metro apps的C#代码如何实现InternalCall 内部调用 RRS feed

  • 问题

  • 目前winform程序的代码为[ComImport, GuidAttribute("77A1C827-FCD2-4689-8915-9D613CC5FA3E"), ClassInterfaceAttribute(ClassInterfaceType.None)]
        internal class SensorManager : ISensorManager
        {
            [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
            public virtual extern void GetSensorsByCategory(
                [In, MarshalAs(UnmanagedType.LPStruct)] REFSENSOR_CATEGORY_ID sensorCategory,
                [Out, MarshalAs(UnmanagedType.Interface)] out ISensorCollection ppSensorsFound);

    }

    想移植到windows 8 metro apps中,这一段代码  [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]在metro中如何实现,求高手相助,谢谢!

    2012年7月6日 1:36

答案

全部回复

  • 请从你为什么要使用 Interop Assembly 开始考虑是否需要设计新的WinRT Library。

     [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]这段代码 MethodImpl MethodImplOptions 都在Metro中是支持的,但MethodCodeType 没有。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月6日 4:57
    版主
  • 目前的代码为:

    namespace SensorHub.Uility.SensorProperties
    {

    public static class SensorManager

    {

    private static ISensorManager _sensorMgr;

    static SensorManager()
            {

                _sensorMgr = new SensorHub.Uility.SensorProperties.Internal.SensorManager();
            }

    }

    }

    namespace SensorHub.Uility.SensorProperties.Internal
    {

     [ComImport, GuidAttribute("77A1C827-FCD2-4689-8915-9D613CC5FA3E"), ClassInterfaceAttribute(ClassInterfaceType.None)]
        internal class SensorManager : ISensorManager
        {
           
            [MethodImpl((MethodImplOptions)MethodImplAttributes.InternalCall)]
            public virtual extern void GetSensorsByCategory(
                [In, MarshalAs(UnmanagedType.LPStruct)] REFSENSOR_CATEGORY_ID sensorCategory,
                [Out, MarshalAs(UnmanagedType.Interface)] out ISensorCollection ppSensorsFound);

    }

     [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("BD77DB67-45A8-42DC-8D00-6DCF15F8377A")]
        internal interface ISensorManager
        {
            /// <summary>
            /// Get a collection of related sensors by category, Ex: Light
            /// </summary>
            /// <param name="sensorCategory">The category of sensors to find</param>
            /// <param name="ppSensorsFound">The collection of sensors found</param>
            void GetSensorsByCategory(
                [In, MarshalAs(UnmanagedType.LPStruct)] REFSENSOR_CATEGORY_ID sensorCategory,
                [Out, MarshalAs(UnmanagedType.Interface)] out ISensorCollection ppSensorsFound);

    }

    }

    上述代码为metro app中的, 执行静态构造函数时就会报错。

    不知如何修改!

    2012年7月6日 6:46
  • 不知道你所做的是否是可以符合Metro API规范的 和你用的三方库是否是符合要求的。但是我还是建议,你考虑下需要重写,并且审核这个API是否能够在Metro下工作。 但从代码上,这里有很多问题,一是有些Attributes已经不在Metro下被支持;ISensorCollection 这个接口是否是Metro下支持的。

    看似你要使用一些传感器一类的操作,那么请参考WinRT关于传感器的API,http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.aspx 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月6日 7:00
    版主
  • Metro app中 如何获取Sensor 的设备信息呢,比如说某个Sensor 的DEVICE_ID
    2012年7月6日 8:19