无法使用C ++ / CLI

时间:2016-01-18 20:15:15

标签: c# .net visual-studio dll c++-cli

先谢谢你的时间和帮助。

目标:我正在尝试在C ++项目中使用我的C#库

我做了什么

  1. 使用我的C#项目创建了一个简单的.dll文件。 named:ClassLibrary1.dll
  2. 创建了一个名为CppClr的C ++控制台应用程序(公共语言运行时支持更改为:/ clr)
  3. 将ClassLibrary1.dll复制到CppClr项目的根目录
  4. 以下是我的ClassLibrary1(C#)代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    
    namespace ClassLibrary1
    {
        public class Class1
        {
            public static void output()
            {
    
                String mystr; 
    
    
                mystr = "Helloo World"; // create a new string
    
                Console.WriteLine(mystr);
                Console.WriteLine("From C++ Managed Code!");
                Console.ReadLine();
            }
        }
    }
    

    以下是我的C ++ / CLI代码:

    #include "CppClr.h"
    #using <ClassLibrary1.dll>
    
    int main()
    {
        ClassLibrary1::Class1::output();
    }
    

    问题:运行C ++ / CLI代码时出现的错误:

      

    未处理的类型&#39; System.IO.FileNotFoundException&#39;发生在未知模块中。附加信息:无法加载文件或程序集&#39; ClassLibrary1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#39;或其中一个依赖项。系统找不到指定的文件。

3 个答案:

答案 0 :(得分:1)

当您想要添加从C ++项目创建的dll时,Chad共享的msdn链接就是这种情况。

您需要做的是为C#库创建一个强名称。

  • 要为类库创建强名称,请在Visual Studio .NET命令提示符处键入以下命令: sn.exe -k MyKeyFile.SNK

  • 将MyKeyFile.SNK文件复制到项目文件夹中。

  • 双击AssemblyInfo.cs文件以在“解决方案资源管理器”中打开该文件。
  • 替换AssemblyInfo.cs文件中的以下代码行

    [assembly: ComVisible(false)]
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile("")]
    

    [assembly: ComVisible(true)] 
    [assembly: AssemblyDelaySign(false)] 
    [assembly: AssemblyKeyFile("..\\..\\MyKeyFile.SNK")]
  • 按CTRL + SHIFT + B生成托管DLL。
  • 现在注册托管DLL以与COM或Native C ++一起使用
  • 从Native C ++ Code调用托管DLL或使用它。

这里的链接接近OP试图做的事情。 https://support.microsoft.com/en-us/kb/828736

答案 1 :(得分:1)

您的问题只是您的C ++可执行文件无法在运行时找到/加载C#DLL的问题。

.NET运行时有几个不同的地方可以加载程序集。其中最简单的是来自运行已编译应用程序的同一目录。在C ++项目的根目录中使用ClassLibrary1.dll是不够的 - 它需要位于运行项目的同一目录中。

作为快速而肮脏的测试,您应该能够通过将ClassLibrary1.dll复制到C ++项目的输出目录来验证这一点。如果您正在调试配置中运行,那么这可能类似于C:\Projects\CppClr\Debug\或者您的C ++项目。验证这是包含已编译的CppClr.exe文件的目录。一旦你在这里复制DLL并运行你的项目,运行时应该能够找到DLL并且一切都应该是好的。

但是,如果您经常更新C#项目,这可能会很麻烦,因为每次更改时您都需要将其复制到C ++输出文件夹。解决方法是在C ++项目中将引用添加到C#库中。

在Visual Studio中,打开您的C ++项目。在解决方案资源管理器中,右键单击引用,然后选择添加引用... 接下来,单击浏览... 按钮在对话框的底部,浏览到磁盘上ClassLibrary1.dll的位置。点击添加,然后点击确定

现在,无论何时构建C ++项目,它都会将ClassLibrary1.dll程序集复制到项目的输出文件夹中。您还应该能够从C ++文件的顶部删除#using <ClassLibrary1.dll>指令,因为将DLL添加为项目引用应该执行相同的功能。

答案 2 :(得分:0)

我能够通过指定dll文件的绝对路径来解决这个问题。

之前:

#using "ClassLibrary1.dll"

后:

#using "C:\user\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll"

如果这对您有用,则需要转到属性 - &gt; C / C ++ - &gt;一般 - &gt; “解决#using References”并在此处添加路径。那么你可以在没有完整路径的情况下再次使用#using "ClassLibrary1.dll"

找到了答案here