Powershell и перечисления, определенные в сборке C++/CLI

У меня есть сборка, написанная на C++/CLI, которая содержит кучу перечислений, определенных следующим образом, один за другим в одном заголовочном файле.

namespace Fix
{
    public enum class Side
    {
        SideBuy = '1',
        SideSell = '2'
    };
}

Я могу ссылаться на эти типы в других проектах C#, а в IronPython я могу отразить сборку и увидеть их все без каких-либо проблем. Я также использовал их в Powershell в течение многих месяцев без проблем - до сих пор. Я ссылаюсь на них так:

[Fix.Side]::SideBuy

Я только что перешел с Visual Studio 2008 на Visual Studio 2010, и теперь некоторые перечисления, которые я определил таким образом, невидимы для Powershell. Я не вижу никакой разницы в объявлениях и могу без проблем отражать типы.

Это сборка .NET 4.0, и я настроил Powershell для работы со средой выполнения 4.0. Я сделал это со следующими изменениями в реестре.

reg add hklm\software\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1
reg add hklm\software\wow6432node\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1

У кого-нибудь были такие проблемы?


person Gary    schedule 27.07.2010    source источник
comment
как вы настроили powershell для работы с 4.0? вы проверили с помощью $psversiontable?   -  person x0n    schedule 29.07.2010


Ответы (1)


Меня устраивает. Мои шаги:

Я создаю сборку C++/CLI .NET 4.0 с одним исходным файлом (кроме stdafx.*):

#include "stdafx.h"

namespace Fix 
{ 
    public enum class Side 
    { 
        SideBuy = '1', 
        SideSell = '2' 
    }; 
} 

Затем я создаю и вызываю этот тестовый скрипт:

Add-Type -Path "C:\...\TryEnum40.dll"
[Fix.Side]::SideBuy

Это работает: значение перечисления печатается, как и ожидалось.

Как настроить PowerShell для работы с .NET 4.0? Я не использую никаких трюков с реестром. Я создаю XML-файл «powershell.exe.config» в домашнем каталоге PS (или в домашнем каталоге приложения, реализующего узел PowerShell (например, MyApp.exe.config), я тоже пробовал такой сценарий).

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0.30319"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

Машина x64: файл также необходимо скопировать в C:\Windows\SysWOW64\WindowsPowerShell\v1.0

P.S. Если это по-прежнему не помогает, не могли бы вы предоставить точное сообщение об ошибке, которое вы получаете?

person Roman Kuzmin    schedule 29.07.2010
comment
Никакой радости, спасибо за опцию файла конфигурации, взлом реестра был болезненным, потому что он затронул другое программное обеспечение. - person Gary; 30.07.2010
comment
Простой случай, который вы продемонстрировали, также работает для меня, в реальной ситуации у меня есть много перечислений, определенных в файле заголовка. Powershell просто говорит, что не может найти тип, я также могу заставить его не работать с разными типами, изменив порядок объявлений. Это очень странно. У меня также был отчет пользователя о той же проблеме с типом класса. - person Gary; 30.07.2010