无法从C+;使用自定义.dll(C#)+/CLI
提前感谢您的时间和帮助无法从C+;使用自定义.dll(C#)+/CLI,c#,.net,visual-studio,dll,c++-cli,C#,.net,Visual Studio,Dll,C++ Cli,提前感谢您的时间和帮助 目标< /强>:我试图在C++项目中使用我的C库 我所做的: 用我的C#项目创建了一个简单的.dll文件。名称:ClassLibrary1.dll 创建了一个C++控制台应用程序名为:CppClr(公共语言运行时支持更改为:/CLR) 已将ClassLibrary1.dll复制到根CPPCRL项目 以下是我的ClassLibrary1(C#)代码: 以下是我的C++/CLI代码: #include "CppClr.h" #using <ClassLibrary1.
<强>目标< /强>:我试图在C++项目
中使用我的C库 我所做的:#include "CppClr.h"
#using <ClassLibrary1.dll>
int main()
{
ClassLibrary1::Class1::output();
}
#包括“cppchr.h”
#使用
int main()
{
ClassLibrary1::Class1::output();
}
问题:运行C++/CLI代码时出现的错误:
未知模块中发生类型为“System.IO.FileNotFoundException”的未处理异常。其他信息:无法加载文件或程序集“ClassLibrary1,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件
乍得共享的MSDN链接是在您想添加C++项目创建的DLL时的情况。 您需要做的是为您的C#库创建一个强名称
- 要为类库创建强名称,请在Visual Studio.NET命令提示符下键入以下命令: sn.exe-k MyKeyFile.SNK
- 将MyKeyFile.SNK文件复制到项目文件夹中
- 双击AssemblyInfo.cs文件以在解决方案资源管理器中打开该文件
- 替换AssemblyInfo.cs文件中的以下代码行
[assembly: ComVisible(false)] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")]
- 按CTRL+SHIFT+B生成托管DLL
- 现在注册托管DLL,以便与COM或本机C一起使用++ < LI>调用来自本地C++代码的托管DLL或使用它。
< p>您的问题只是一个问题,您C++的可执行文件不能在运行时找到/加载c*ydll。 .NET运行时可以在几个不同的位置加载程序集。其中最简单的是运行编译后的应用程序的同一目录。只在C++项目的根目录中有<代码>类LableLable1.DLL/COD>是不够的,它需要在同一个目录中运行。
作为一个快速和肮脏的测试,您应该能够通过复制<代码> CyraseLable1.DLL>代码>来验证C++的输出目录。如果您在调试配置中运行,这可能会像“代码> C:\Project \ CPPPLR\Debug \\代码>或您的C++项目所在的地方。验证这是包含编译的
cppchr.exe
文件的目录。在这里复制DLL并运行项目后,运行时应该能够找到DLL,一切都应该正常
但是,如果你经常更新你的C项目,这可能是一种痛苦,因为每次需要改变时,你都需要把它复制到C++输出文件夹。解决方案是将C++项目中的引用添加到C语言库中。
在VisualStudio中,打开C++项目。在解决方案资源管理器中,右键单击引用并选择添加引用…下一步,单击对话框底部的浏览…按钮,并浏览到磁盘上的ClassLibrary1.dll
位置。单击添加,然后单击确定
现在,每当你构建C++项目时,它会将
#using "ClassLibrary1.dll"
之后:
#using "C:\user\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll"
如果这对您有效,您需要转到属性->C/C++->常规->“使用引用解析”并在此处添加路径。然后,您可以使用#在您的can中再次使用“ClassLibrary1.dll”
,而不需要完整的路径
回答发现
是否需要将.dll包含在C++项目中的任何项目引用中?我不确定你是什么意思……这里请参阅:我不相信在根文件夹级别上拥有.dll将足够了。在您的解决方案中应该有一种方法可以右键单击并包含引用>浏览>查找您的.dll并将其包含在解决方案中。该解决方案建议我还需要将.lib文件与.dll文件一起包含。但是,当我创建ClassLibrary1时,它只生成ClassLibrary1.dll和ClassLibrary1.pdb,没有生成.lib文件。我对sn.exe-k MyKeyFile.SNK
的访问被拒绝。我想这需要以管理员身份运行?这是一台公司计算机,我没有管理员权限。还有其他方法吗?在这种情况下,您需要至少访问这一个文件夹。我猜它是Windows7系统。“C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys”这是默认密钥容器所在的位置,由sn工具使用。我确实可以访问该文件夹,但当我运行上述命令时,我得到:无法创建MyKeyFile.SNK--拒绝访问
我相信我无法在该文件夹中输出该文件,有没有办法指定输出文件的位置?我应该完全指定,我的意思是,检查您对该文件夹有哪些权限。右键单击MachineKeys文件夹->选择属性->转到安全选项卡,检查您的用户名是否属于具有读取和执行权限的组。如果你不这样做,那么联系任何你的帮助台,让他们提供你在一个文件夹上的阅读和执行权限。如果C++项目是用原来的问题中的CLR支持编译的,那么没有理由用COM作为登记C库的理由。
#using "ClassLibrary1.dll"
#using "C:\user\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll"