Сборка сборки MSBuild не может быть зарегистрирована, RegAsm (ошибка RA000); Точно такой же .csProj с Visual Studio 2010 создает действительную сборку?

У меня есть простой проект C#, когда он создается с помощью MSBuild, он создает сборку, которую нельзя зарегистрировать с помощью RegAsm (ошибка RA000).

Точно такой же .csProj, созданный с помощью Visual Studio 2010, создает действительную сборку, и RegAsm успешно регистрируется?

Я использую C:\windows\microsoft.net\framework64\v4.0.30319\msbuild.exe

Обе сборки (MSBuild 4.0 и Visual Studio 2010) выполняются с правами администратора, поэтому право на регистрацию включено.

  • Я ищу способ решить/понять/отладить эту неприятную аномалию.
  • Может ли быть исправление/SPx для MSBuild 4.0, которого мне не хватает?
  • Есть ли инструмент для создания карты, подобной файлу (или другому форматеру .dll), чтобы я мог сравнить две полученные сборки на предмет различий?

Вывод RegAsm из MSbuild build bTest.dll:

Microsoft (R) .NET Framework Assembly Registration Utility 4.0.30319.1
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.
RegAsm : error RA0000 : Failed to load 'C:\test\bTest.dll' because it is not a valid .NET assembly

Вывод RegAsm из сборки Visual Studio 2010 bTest.dll:

Microsoft (R) .NET Framework Assembly Registration Utility 4.0.30319.1
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.
Types registered successfully
Assembly exported to   'C:\test\bTest.tlb', and the type library was registered successfully

Для приведенного выше файла bTest.csProj флажок Register COM interop был снят, а RegAsm был выполнен как шаг после сборки.

Если сборки выполняются с установленным флажком Register COM interop, то он включен; сборка Visual Studio 2010 корректно создает bTest.tlb. Однако MSBuild не создает файл bTest.tlb, и результирующая сборка по-прежнему не работает с инструментом RegAsm 4.0.

Заранее спасибо.

Кевин Уэйт


person kevinwaite    schedule 27.10.2013    source источник


Ответы (1)


Я использую Jenkins, и это задание унаследовало эту конкретную форму настройки платформы, скопированную из другого очень похожего задания (это также, вероятно, неправильно, насколько я понимаю).

Наличие этого PlatformTarget=x86 делает результирующую сборку/.dll недоступной для регистрации. Будь то флажок Register COM Interop или инструмент RegAsm. И я сомневаюсь, что нужна такая испорченная .dll.

Если MSBuild использует эти определенные Jenkins аргументы командной строки; полученная .dll будет незарегистрируемой. И, конечно же, сборки Visual Studio 2010 этого не делают и, таким образом, строятся успешно...

-p:PlatformTarget=x86;Configuration=Release

Исправление следующего, и задание успешно строится и прекрасно создает *.tlb!

-p:Configuration=Release

РЕШЕНО!

person kevinwaite    schedule 27.10.2013
comment
Какую версию регазма вы использовали? если вы использовали версию Framework64 для сборки x86, вы получите сообщение об ошибке RegAsm: ошибка RA0000: не удалось загрузить «YourLib.dll», поскольку это недопустимая сборка .NET. Используйте версию x86, и она будет работать. - person timB33; 28.08.2015