先谢谢你的时间和帮助。
目标:我正在尝试在C ++项目中使用我的C#库
我做了什么:
以下是我的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;或其中一个依赖项。系统找不到指定的文件。
答案 0 :(得分:1)
当您想要添加从C ++项目创建的dll时,Chad共享的msdn链接就是这种情况。
您需要做的是为C#库创建一个强名称。
要为类库创建强名称,请在Visual Studio .NET命令提示符处键入以下命令: sn.exe -k MyKeyFile.SNK
将MyKeyFile.SNK文件复制到项目文件夹中。
替换AssemblyInfo.cs文件中的以下代码行
[assembly: ComVisible(false)]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
带
[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\MyKeyFile.SNK")]
这里的链接接近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