事实上,我得到了一个C++(工作)DLL,我想导入我的C#项目来调用它的函数.
当我指定DLL的完整路径时,它确实有效,如下所示:
string str = "C:\\Users\\userName\\AppData\\Local\\myLibFolder\\myDLL.dll";
[DllImport(str, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLFunction(int Number1, int Number2);
Run Code Online (Sandbox Code Playgroud)
问题是它将是一个可安装的项目,因此用户的文件夹将不同(例如:皮埃尔,保罗,杰克,妈妈,爸爸......),这取决于计算机/会话的运行情况.
所以我希望我的代码更通用,如下所示:
/*
goes right to the temp folder of the user
"C:\\Users\\userName\\AppData\\Local\\temp"
then go to parent folder
"C:\\Users\\userName\\AppData\\Local"
and finally go to the DLL's folder
"C:\\Users\\userName\\AppData\\Local\\temp\\myLibFolder"
*/
string str = Path.GetTempPath() + "..\\myLibFolder\\myDLL.dll";
[DllImport(str, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLFunction(int Number1, int Number2);
Run Code Online (Sandbox Code Playgroud)
最重要的是"DllImport"需要DLL目录的"const string"参数.
所以我的问题是::在这种情况下可以做些什么?
我在后期构建事件中使用此命令从项目生成nuget包.变量%conf%设置为正确的配置(调试或发布),并且%1是项目名称(例如"MyCompany.MyProject").
nuget pack -Prop Configuration=%conf% "%1.csproj" -exclude *.sql -IncludeReferencedProjects
Run Code Online (Sandbox Code Playgroud)
此软件包仅供我们自己使用,永远不会在nuget上发布.它以我们的私有存储库结束.
在项目中,有一个设置为generate action : content和的文件copy local : always.(我的视觉工作室是法语,所以我不是百分之百地确定了它的变形).我们来命名吧importantfile.xml.
在生成的包中,我最终得到了这个结构:
- content
- importantfile.xml
- lib
-net45 (.NetFramework,Version=v4.5)
-MyCompany.MyProject.dll
Run Code Online (Sandbox Code Playgroud)
哪个好,我想importantfile.xml部署在包中,因为,这个文件很重要!
当我在另一个项目中安装软件包时,importantfile.xml将部署在项目的根目录下.没关系.但事实并非如此copy local : always.
我需要的importantfile.xml是copy local : always在这个项目中,我安装我的包.
我怎样才能做到这一点?
备注:
我可以copy local : always在安装软件包后立即设置文件,这没什么大不了的.如果以后更新软件包会让这个属性按原样,我会忍受它,但事实并非如此.当更新包,copy local被重置了以never(为说明这里).
项目文件夹中有一个nuspec文件,这里是:
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version> …Run Code Online (Sandbox Code Playgroud) copy-local visual-studio nuget nuget-package visual-studio-2012
我有一个混合模式C++项目,生成一个托管DLL程序集导出一些CLR类(称之为Managed.dll).这个项目使用的是原生dll(称之为Native.dll).
当我从另一个生成Client.exe的项目引用Managed.dll时,一切都按预期工作,除了我需要在与Client.exe相同的文件夹中手动复制Native.dll.
如果有办法说服VS本地复制(在Client.exe的bin文件夹中)不仅Managed.dll而且还有Native.dll?
我试图在清单中包含Native.dll作为依赖程序集,但这没有帮助.
编辑
Managed.dll将成为可再发行组件.它将安装在"C:\ Program Files ....."的文件夹中.当使用Visual Studio的开发人员添加对Managed.dll的引用时,还应将Native.dll复制到其项目的\ bin文件夹中.
如何在.NET Core项目(类库)中添加C++库的方法.我尝试创建一个nuget包但不起作用.我收到了这个错误:
An unhandled exception of type 'System.DllNotFoundException' occurred in "NameOfDll.dll"
当我添加nuget包时,project.json添加以下引用:
"dependencies": {
"Core": "1.0.0-*",
"NETStandard.Library": "1.6.0",
"NameOfDll.dll": "1.0.0"
},
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 .NET 标准 nuget 内容文件包(没有托管程序集),供 .NET Framework 程序集使用。我的目标是将此文件文件夹复制到消费程序集的 bin 文件夹中。
这个问题类似于Add native files from NuGet package to project output directory(并使用这个 nuget 包http://www.nuget.org/packages/Baseclass.Contrib.Nuget.Output/),但我需要我的 nuget 包.NET 标准
我已经在 contentfiles\any\any\myfiles 下的程序集中添加了文件,并将以下内容添加到 nuspec 文件的元数据部分:
<contentFiles>
<files include="any/any/myfiles/*" buildAction="None" copyToOutput="true" />
</contentFiles>
Run Code Online (Sandbox Code Playgroud)
当我尝试将其添加到 .NET 框架程序集时,出现错误
无法安装包“myPackage 1.0.0”。您正在尝试将此包安装到以“.NETFramework,Version=v4.6.2”为目标的项目中,但该包不包含任何与该框架兼容的程序集引用或内容文件。有关更多信息,请联系软件包作者。
我还尝试将文件添加到项目的根目录,并在 nuspec 文件的元数据元素下方添加以下内容:
<files>
<file src="myfiles\**\*" target="myfiles" />
</files>
Run Code Online (Sandbox Code Playgroud)
完整的 nuspec 文件:
<?xml version="1.0"?>
<package>
<metadata>
<id>myPackage</id>
<version>1.0.0</version>
<title>myPackage</title>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>my files/description>
<releaseNotes></releaseNotes>
<tags></tags>
<contentFiles>
<files include="any/any/myfiles/*" buildAction="None" copyToOutput="true" />
</contentFiles>
</metadata>
<files>
<file …Run Code Online (Sandbox Code Playgroud) 请考虑以下nuspec文件:
<?xml version="1.0"?>
<package >
[SOME METADATA]
<files>
<file src="bin\x64\$configuration$\GR*.filetype" target="content\" />
</files>
</package>
Run Code Online (Sandbox Code Playgroud)
上面已经成功打包了以'GR'开头的文件类型文件,并将它们添加到我的新的引用解决方案中.
问题是我希望始终将这些文件复制到输出目录.我可以通过nuspec执行此操作,而无需在我的新解决方案中手动修改属性吗?
首先,我读了一些这方面的文章,例如https://learn.microsoft.com/en-us/nuget/create-packages/supporting-multiple-target-frameworks,但它们没有涵盖我的场景以及我的任何内容尝试过没有成功。
我总共有 4 个组件,配置如下:
1. .NET Framework 4.5; Platform x86
2. .NET Framework 4.5; Platform x64
3. UWP10; Platform x86
4. UWP10; Platrofm x64
Run Code Online (Sandbox Code Playgroud)
即使是 .NET Framework,我也没有 AnyCPU 平台程序集。我的所有程序集都以 x86 或 x64 为目标。到目前为止我发现的所有内容都描述了如何仅为 UWP 创建多平台包。我什至还没有尝试过,因为这个主题已经被很好地涵盖了。问题是如何为.NET Framework 4.5打包多平台包。根据包装文章,我似乎必须具有以下文件夹结构
runtimes
win-x86
lib
net45
MyAssembly.dll
win-x64
lib
net45
MyAssembly.dll
Run Code Online (Sandbox Code Playgroud)
我创建了这个结构并尝试使用该包。该软件包安装没有错误,但我无法使用 MyAssembly.dll。看起来构建没有找到它。我尝试了文件夹名称的不同变体,例如“win10-x86”,只是“x86”。什么都不起作用。
是否有可能为 .NET Framework 4.5 提供多平台包?有没有人创建成功的?请分享知识。
谢谢
我正在尝试构建一个 NuGet 包,其中包含本机 DLL,当项目使用该包时,这些 DLL 将放置在输出文件夹中。我试图使用这个问题中的几个建议,但我总是遇到同样的问题。
我目前的 NuGet 包布局是这样的:
\build
packageId.targets
file1.dll
file2.dll
\lib
\netstandard1.4
assembly.dll
Run Code Online (Sandbox Code Playgroud)
内容packageId.targets为:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)\*.dll"/>
<None Include="@(NativeLibs)" Link="$(RecursiveDir)$(Filename)$(Extension)">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
根据其他问题的答案,这应该会导致我的 DLL 被放置在bin\Debug使用包的项目目录中。然而,他们不是。相反,它们被放置在bin\Debug\packages\packageId\build.
现在我已经尝试了很多,我注意到越来越多我无法理解的奇怪行为:
.targets文件,则它们根本不会被复制。也没有错误信息。.targets文件更改为仅file1.dll在Include=和 中引用,则Link=无论如何都会复制两个文件。.targets文件并将任何内容复制build到输出文件夹中的该路径中,但是当我删除该.targets文件时,DLL 文件将不再被复制。现在我更不明白发生了什么。
我需要更改什么才能将 DLL 直接复制到bin\Debug …
我有一些本机 dll,必须根据平台条件将其复制到 bin 文件夹中。我希望将它们复制到引用该项目的项目的 bin 文件夹中。
如果我将构建操作设置为Content,它们将被复制到 bin 文件夹,但保留文件夹结构,因此它们不会位于 bin 文件夹中,而是位于子文件夹中。因此,当运行程序时,它将无法解析 dll,因为它们位于子文件夹中。
例如,如果我的项目文件中有此代码
<Choose>
<When Condition=" '$(Platform)'=='x86' ">
<ItemGroup>
<Content Include="nativedll\somelib\x86\somelib.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</When>
<When Condition=" '$(Platform)'=='x64' ">
<ItemGroup>
<Content Include="nativedll\somelib\x64\somelib.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</When>
</Choose>
Run Code Online (Sandbox Code Playgroud)
bin\nativedll\somelib\x86\somelib.dll如果是 x86,该 dll 将位于该文件夹中。
所以我尝试使用构建后脚本
<PostBuildEvent>
IF "$(Platform)" == "x86" (
xcopy /s /y "$(ProjectDir)\nativedll\somelib\x86" "$(TargetDir)"
)
IF "$(Platform)" == "x64" (
xcopy /s /y "$(ProjectDir)\nativedll\somelib\x64" "$(TargetDir)"
)
</PostBuildEvent>
Run Code Online (Sandbox Code Playgroud)
但是 dll 被复制到项目的 bin 文件夹中,而不是复制到引用它的项目的 bin 文件夹中。
所以我现在的解决方案是在使用此脚本的所有项目中添加一个构建后脚本。
在 Visual Studio …