Как изменить свойства элемента программно (Content Processor XNA 4.0)?

Мне нужно сменить обработчик контента моих моделей программно или свойство файла fbx (XNA Framework Content Pipeline->Content Processor) из решения / проекта из-за пользовательского обработчика контента. И это все потому, что я хочу, чтобы пользователь, использующий эту программу, добавил свою модель обложки и изменил это свойство. Заранее спасибо и мои извинения, если вопрос расплывчатый или повторяющийся.

Обновить

Проведя некоторые исследования, я нашел своего рода решение для доступа к проекту, но, к сожалению, получаю ошибку при попытке получить элементы проекта в моем решении / проекте... все еще могу получить доступ к свойствам проекта (не пытался их изменить).

вот код (который был похож на шаблон MSDN):

    static void Main(string[] args)
    {
        EnvDTE80.DTE2 dte;
        object obj = null;
        System.Type t = null;

        t = System.Type.GetTypeFromProgID("VisualStudio.DTE.11.0", true);

        obj = System.Activator.CreateInstance(t, true);

        dte = (EnvDTE80.DTE2)obj;

        string solutionFile = 
            "C:\\Users\\The Wizard Of Code\\Documents\\Visual Studio 2012\\Projects\\ConsoleApplication2\\ConsoleApplication2.sln";

        MessageFilter.Register();
        //dte.MainWindow.Activate();

        /*Problem I think*/
        Solution2 soln = (Solution2)dte.Solution;
        soln.open(solutionFile);
        Console.WriteLine(soln.Item(1).ProjectItems.Item(1).Name);

        dte.Quit();
        MessageFilter.Revoke();

    }

Сообщение об ошибке: Фильтр сообщений показал, что приложение занято. (Исключение из HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))

Обновление 2 Класс фильтра сообщений: открытый класс MessageFilter: IOleMessageFilter { // // Класс, содержащий IOleMessageFilter // поток обработки ошибок.

    // Start the filter.
    public static void Register()
    {
        IOleMessageFilter newFilter = new MessageFilter();
        IOleMessageFilter oldFilter = null;
        CoRegisterMessageFilter(newFilter, out oldFilter);
    }

    // Done with the filter, close it.
    public static void Revoke()
    {
        IOleMessageFilter oldFilter = null;
        CoRegisterMessageFilter(null, out oldFilter);
    }

    //
    // IOleMessageFilter functions.
    // Handle incoming thread requests.
    int IOleMessageFilter.HandleInComingCall(int dwCallType,
      System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr
      lpInterfaceInfo)
    {
        //Return the flag SERVERCALL_ISHANDLED.
        return 0;
    }

    // Thread call was rejected, so try again.
    int IOleMessageFilter.RetryRejectedCall(System.IntPtr
      hTaskCallee, int dwTickCount, int dwRejectType)
    {
        if (dwRejectType == 2)
        // flag = SERVERCALL_RETRYLATER.
        {
            // Retry the thread call immediately if return >=0 & 
            // <100.
            return 99;
        }
        // Too busy; cancel call.
        return -1;
    }

    int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee,
      int dwTickCount, int dwPendingType)
    {
        //Return the flag PENDINGMSG_WAITDEFPROCESS.
        return 2;
    }

    // Implement the IOleMessageFilter interface.
    [DllImport("Ole32.dll")]
    private static extern int
      CoRegisterMessageFilter(IOleMessageFilter newFilter, out 
      IOleMessageFilter oldFilter);
}

[ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface IOleMessageFilter
{
    [PreserveSig]
    int HandleInComingCall(
        int dwCallType,
        IntPtr hTaskCaller,
        int dwTickCount,
        IntPtr lpInterfaceInfo);

    [PreserveSig]
    int RetryRejectedCall(
        IntPtr hTaskCallee,
        int dwTickCount,
        int dwRejectType);

    [PreserveSig]
    int MessagePending(
        IntPtr hTaskCallee,
        int dwTickCount,
        int dwPendingType);
}

извините за загрузку кода

Обновление 3

Мне удалось получить доступ к свойствам, но это были свойства файла, а не свойства, которые я получаю, когда щелкаю правой кнопкой мыши элемент в каком-либо проекте или решении и получаю эту вкладку в правом нижнем углу (что мне нужно сделать с помощью кода).

1 ответ

Решение

[STAThread] до того, как main, кажется, решает проблему src: http://msdn.developer-works.com/article/11266583/why+looping+through+projectitems+sometimes+causes+Exception+from+HRESULT%3A+0x8001010A+(RPC_E_SERVERCALL_RETRYLATER)....

Обновление modelviewer.codeplex.com было то, что мне было нужно.

Другие вопросы по тегам