Sfoglia il codice sorgente

Merge branch 'backport-vs-csharp-ref-no-asm' into vs-csharp-ref-no-asm

Brad King 8 anni fa
parent
commit
94e70e5329

+ 13 - 0
Source/cmGlobalVisualStudioGenerator.cxx

@@ -782,6 +782,19 @@ bool cmGlobalVisualStudioGenerator::TargetIsCSharpOnly(
   return false;
 }
 
+bool cmGlobalVisualStudioGenerator::TargetCanBeReferenced(
+  cmGeneratorTarget const* gt)
+{
+  if (this->TargetIsCSharpOnly(gt)) {
+    return true;
+  }
+  if (gt->GetType() != cmStateEnums::SHARED_LIBRARY &&
+      gt->GetType() != cmStateEnums::EXECUTABLE) {
+    return false;
+  }
+  return true;
+}
+
 bool cmGlobalVisualStudioGenerator::TargetCompare::operator()(
   cmGeneratorTarget const* l, cmGeneratorTarget const* r) const
 {

+ 3 - 0
Source/cmGlobalVisualStudioGenerator.h

@@ -85,6 +85,9 @@ public:
   // return true if target is C# only
   static bool TargetIsCSharpOnly(cmGeneratorTarget const* gt);
 
+  // return true if target can be referenced by C# targets
+  bool TargetCanBeReferenced(cmGeneratorTarget const* gt);
+
   /** Get the top-level registry key for this VS version.  */
   std::string GetRegistryBase();
 

+ 7 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -3607,6 +3607,13 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
     this->WriteString("<Name>", 3);
     (*this->BuildFileStream) << name << "</Name>\n";
     this->WriteDotNetReferenceCustomTags(name);
+    if (csproj == this->ProjectType) {
+      if (!static_cast<cmGlobalVisualStudioGenerator*>(this->GlobalGenerator)
+             ->TargetCanBeReferenced(dt)) {
+        this->WriteString(
+          "<ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n", 3);
+      }
+    }
     this->WriteString("</ProjectReference>\n", 2);
   }
   this->WriteString("</ItemGroup>\n", 1);

+ 6 - 0
Tests/CSharpLinkToCxx/CMakeLists.txt

@@ -15,3 +15,9 @@ target_compile_options(CLIApp PRIVATE "/clr")
 add_executable(CSharpLinkToCxx csharp.cs)
 
 target_link_libraries(CSharpLinkToCxx CLIApp)
+
+# this unmanaged C++ library will be added to the C#/.NET
+# references of CSharpLinkToCxx but it will show a warning
+# because it is unmanaged
+add_library(CppNativeApp SHARED cpp_native.hpp cpp_native.cpp)
+target_link_libraries(CSharpLinkToCxx CppNativeApp)

+ 10 - 0
Tests/CSharpLinkToCxx/cpp_native.cpp

@@ -0,0 +1,10 @@
+#include "cpp_native.hpp"
+
+#include <iostream>
+
+namespace CppApp {
+void MyCpp::testMyCpp()
+{
+  std::cout << "#message from CppApp" << std::endl;
+}
+}

+ 9 - 0
Tests/CSharpLinkToCxx/cpp_native.hpp

@@ -0,0 +1,9 @@
+#pragma once
+
+namespace CppApp {
+class MyCpp
+{
+public:
+  void testMyCpp();
+};
+}