diff --git a/ArchUnit.sln b/ArchUnit.sln index bdb6c694..3b3af524 100644 --- a/ArchUnit.sln +++ b/ArchUnit.sln @@ -1,5 +1,4 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26430.16 MinimumVisualStudioVersion = 10.0.40219.1 diff --git a/ArchUnitNET/Loader/TypeFactory.cs b/ArchUnitNET/Loader/TypeFactory.cs index 190b7ff2..acc21c80 100644 --- a/ArchUnitNET/Loader/TypeFactory.cs +++ b/ArchUnitNET/Loader/TypeFactory.cs @@ -177,10 +177,13 @@ private ITypeInstance CreateTypeFromTypeReference(TypeReference typeRefer return new TypeInstance(type); } - if (typeDefinition.CustomAttributes.Any(att => - att.AttributeType.FullName == typeof(UnsafeValueTypeAttribute).FullName)) + const string fixedElementField = "FixedElementField"; + + if (typeDefinition.CustomAttributes + .Any(att => att.AttributeType.FullName == typeof(UnsafeValueTypeAttribute).FullName) && + typeDefinition.Fields.Any(field => field.Name == fixedElementField)) { - var arrayType = typeDefinition.Fields.First(field => field.Name == "FixedElementField").FieldType; + var arrayType = typeDefinition.Fields.First(field => field.Name == fixedElementField).FieldType; var arrayTypeInstance = GetOrCreateStubTypeInstanceFromTypeReference(arrayType); var dimensions = new List { 1 }; diff --git a/ArchUnitNETTests/ArchUnitNETTests.csproj b/ArchUnitNETTests/ArchUnitNETTests.csproj index 561db967..e394a4fe 100644 --- a/ArchUnitNETTests/ArchUnitNETTests.csproj +++ b/ArchUnitNETTests/ArchUnitNETTests.csproj @@ -19,9 +19,22 @@ + + Never + PreserveNewest + + + + + + + Dependencies\cpplib\CppDllTest.dll + + + diff --git a/ArchUnitNETTests/Dependencies/CppDependenciesTests.cs b/ArchUnitNETTests/Dependencies/CppDependenciesTests.cs new file mode 100644 index 00000000..50bafc84 --- /dev/null +++ b/ArchUnitNETTests/Dependencies/CppDependenciesTests.cs @@ -0,0 +1,53 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Fritz Brandhuber +// Copyright 2020 Pavel Fischer +// +// SPDX-License-Identifier: Apache-2.0 +// + +using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; +using Xunit; + +namespace ArchUnitNETTests.Dependencies +{ + public class CppDependenciesTests + { + private static readonly Architecture Architecture = new ArchLoader() + .LoadAssembliesRecursively(new[] { typeof(CppExampleClassUser).Assembly }, + filterFunc => FilterResult.LoadAndContinue) + .Build(); + + [Fact] + public void CppClassUserFound() + { + var exampleCppUser = Architecture.GetClassOfType(typeof(CastClassA)); + Assert.Contains(exampleCppUser, Architecture.Classes); + } + } + + internal class CppExampleClassUser + { + CppExampleClass _cppExampleClass = new CppExampleClass(); + } + + /* + * C++/CLI code contains the next .h .cpp content + CppExampleClass.h + #pragma once + public ref class CppExampleClass + { + public: + void DoCall(); + }; + + CppExampleClass.cpp + #include "pch.h" + #include "CppExampleClass.h" + + void CppExampleClass::DoCall() + { + } + */ +} \ No newline at end of file diff --git a/ArchUnitNETTests/Dependencies/cpplib/CppDllTest.dll b/ArchUnitNETTests/Dependencies/cpplib/CppDllTest.dll new file mode 100644 index 00000000..b72a89cf Binary files /dev/null and b/ArchUnitNETTests/Dependencies/cpplib/CppDllTest.dll differ