上下文:具有2个程序集,Cs和Cpp的Visual Studio解决方案.
我有一些来自nuget.org的纯C#项目的依赖项.我使用作者提供的原始包.将它们添加到Cs项目工作正常,但不是Cpp.
如何将C#包添加到C++项目中?
因为它是C++/Cli,所以我可以很容易地使用.net对象,并且我在C#库中使用例如来自C#库的东西.但不知何故nuget只允许我选择C#项目来添加C#依赖,而不是C++/clr.
我创建了一个C++/CLI(混合)程序集,它有一个围绕某些非托管C++代码的托管包装类.托管部分以.NET 4.6.1为目标,我得到了一个entry.cpp只有这一行的文件来做到这一点:
[assembly:System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.6.1", FrameworkDisplayName = L".NET Framework 4.6.1")];
Run Code Online (Sandbox Code Playgroud)
当我现在在.NET 4.6.1项目中手动包含已编译的程序集时,我可以按预期使用托管类.
该项目可以构建四种方式:x86或x64作为调试或发布版本.它没有托管依赖项.
现在我想要一个(或者如果需要多个)NuGet包,我可以上传到我的feed并在我想要的每个.NET 4.6.1兼容项目中轻松使用包装器组件.我该如何实现这一目标?
到目前为止我尝试了两种方法:
首先,我创建了一个.autopkg文件,根据这篇博文文章提供本机DLL的方式.该files文件的部分如下所示:
files {
// include: { *.h };
[x86,v120,release] {
symbols: { ..\Release\*.pdb; }
bin: { ..\Release\*.dll; }
};
[x86,v120,debug] {
symbols: { ..\Debug\*.pdb; }
bin: { ..\Debug\*.dll; }
};
};
Run Code Online (Sandbox Code Playgroud)
此过程会生成三个.nupkg文件,我可以将其上传到我的Feed.但是当我尝试将该软件包安装到.NET 4.6.1项目时,我收到以下错误消息:
无法安装包'MyCppCliWrapper.redist 1.0.0.2'.您正在尝试将此软件包安装到以".NETFramework,Version = v4.6.1"为目标的项目中,但该软件包不包含任何与该框架兼容的程序集引用或内容文件.有关更多信息,请与软件包作者联系.
所以我重新考虑是否应该使用托管程序集的方式来创建,.nupkg因为程序集有一个我想从托管代码中使用的托管类.我创建了一个.nuspec(使用nuget spec)并提供了元数据.然后我尝试像这样创建我的包:
nuget pack …Run Code Online (Sandbox Code Playgroud) 我正在为名为 BIM Vision 的软件创建插件。他们有一个 C API 的包装器,因此我使用 UnmanagedExports 来让我的非托管 DLL 与包装器一起编译得很好。
问题是我根本无法在我的项目中使用 NuGet 库。它们编译得很好,但在我的代码中调用它们的任何函数都会使软件崩溃。
所有的库都与我自己的 DLL 一起编译在它们自己单独的 DLL 中。软件只能加载我的 DLL(因为其他 DLL 错过了与 BIMVision 对话的代码)
如何让软件找到丢失的 DLL?我应该把它们放在哪里?
我的 .csproj 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{362E40F4-4A37-48B3-A7A5-93E5535A9B22}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ExcelLink</RootNamespace>
<AssemblyName>ExcelLink</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>C:\Users\Daniel\Documents\SAMT\BIMVISION SDK\bim_vision_exe\plugins</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' …Run Code Online (Sandbox Code Playgroud) 我认为这个问题已得到修复.我正在使用Visual Studio 2013,它是Entity Framework 6.1.我收到错误消息:PublicKeyToken = xxxxxx未标记为可序列化.
我以为这是固定的.它是否再次被打破,如果是这样,是否有解决方法?
谢谢.
尝试安装到win32 C++控制台应用程序时,这是完整的错误消息.(使用默认设置构建,没有其他内容添加到新版本.)错误:在程序集'Microsoft.VisualStudio.Project.VisualC.VCProjectEngine,Version = 12.0.0.0,Culture中键入'Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProjectShim' =中性,PublicKeyToken = b03f5f7f11d50a3a'未标记为可序列化.
尝试安装到C++ CLR时,这是完整的错误消息:(实际上,它是完全相同的错误消息.)
尝试安装到常规空C++项目时,这是完整的错误消息:(同样,错误消息相同.)