无法从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库 我所做的

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

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

    #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或使用它。
    这里的链接很接近OP想要做的事情。

    < 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++项目时,它会将 CalpRealQual1.1.DLL> /Cuff>组件复制到项目的输出文件夹中。您还应该能够从C++文件的顶部使用指令删除<代码>。因为添加DLL作为项目引用应该执行相同的功能。< /P> < P>我通过指定DLL文件的绝对路径来解决这个问题。

    之前:

    #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"