我有一个使用DLLImport使用非托管C++ DLL的托管C#dll.一切都很好.但是,我想在我的托管DLL中嵌入非托管DLL,如Microsoft解释:
所以我将非托管dll文件添加到我的托管dll项目,将属性设置为'Embedded Resource'并将DLLImport修改为:
[DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null",
CallingConvention = CallingConvention.Winapi)]
Run Code Online (Sandbox Code Playgroud)
其中'Wrapper Engine'是我托管DLL的程序集名称'Unmanaged Driver.dll'是非托管DLL
当我跑步时,我得到:
访问被拒绝.(HRESULT异常:0x80070005(E_ACCESSDENIED))
我从MSDN和http://blogs.msdn.com/suzcook/看到了这应该是可能的......
我们有两个版本的托管C++程序集,一个用于x86,另一个用于x64.此程序集由符合AnyCPU的.net应用程序调用.我们正在通过文件复制安装部署我们的代码,并希望继续这样做.
当应用程序动态选择其处理器体系结构时,是否可以使用并排程序集清单分别加载x86或x64程序集?或者是否有另一种方法可以在文件复制部署中完成此操作(例如,不使用GAC)?
我目前正在开发一个我们有很多依赖项目的项目.我想将所有引用的dll编译成.exe,就像使用嵌入式资源一样.我已经尝试过ILMerge但它无法处理.xaml资源.
所以我的问题是:有没有办法将WPF项目与多个依赖项合并为一个.exe?
两个问题:
1)ILMerged程序集中不包含基本.NET程序集
从.NET 3.5/Visual Studio 2008升级到.NET 4/Visual Studio 2010后,我在后期构建中使用ILMerge时遇到问题.我有一个解决方案,其中有几个项目的目标框架设置为".NET Framework 4" .我使用以下ILMerge命令将单个项目DLL合并到一个DLL中:
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
Run Code Online (Sandbox Code Playgroud)
如果我不指定.NET 4框架目录的位置,我会从ILMerge得到"Unresolved assembly reference not allowed:System"错误.如果我不指定MSTest目录的位置,我得到"不允许未解析的程序集引用:Microsoft.VisualStudio.QualityTools.UnitTestFramework"错误.
上面的ILMerge命令工作并生成DLL.但是,当我在另一个.NET 4 C#项目中引用该DLL并尝试使用其中的代码时,我收到以下警告:
无法解析主要引用"MyILMergedDLL",因为它对.NET Framework程序集"mscorlib,Version = 4.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"具有间接依赖性,其版本"4.0.65535.65535"高于版本当前目标框架中的"4.0.0.0".
如果我然后删除该/targetplatform:v4标志并尝试使用MyILMergedDLL.dll,我收到以下错误:
"System.Xml.Serialization.IXmlSerializable"类型在未引用的程序集中定义.您必须添加对程序集'System.Xml,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用.
看起来我不应该这样做.使用我的MyILMergedDLL.dll API的人不应该添加对它引用的任何库的引用.我怎么能绕过这个?
2)仅在使用合并程序集时出现TypeLoadException
编辑:除此之外,即使我System.Xml在使用MyILMergedDLL.dll的使用者项目中添加引用,使用MyILMergedDLL.dll中的一些代码也会产生以下异常:
System.TypeLoadException:无法从程序集'MyILMergedDLL,Version = 1.0.1.1,Culture = neutral,PublicKeyToken = …
如何在Visual Studio中创建一个独立的exe.它只是一个简单的控制台应用程序,我认为用户不希望安装一个小的控制台应用程序.我使用visual studio命令提示符编译了一个简单的cpp文件.即使没有安装.NET框架,exe也会工作吗?我使用原生C++代码.
Visual Studio 2017让我知道今天早上有对Fody版本5的升级。我接受了Fody和PropertyChanged.Fody并对其进行了NuGet软件包更新。
现在,我的项目/解决方案将不再构建。
错误是:
“ Fody仅在MSBuild 16及更高版本上受支持。当前版本:15。”
我尝试卸载,关闭VS,然后重新安装均无济于事。
我有一个Windows C#程序,它使用C++ DLL进行数据i/o.我的目标是将应用程序部署为单个EXE.
创建这样的可执行文件有哪些步骤?
我正在编写一个使用MS Chart for .net 3.5实用程序的项目.
但是,要么所有用户都需要安装它,要么我需要将dll与程序打包在一起.
我可以让Visual Studio将dll复制到包含该程序的文件夹中,但是是否可以将其嵌入到dll中,以便只有一个文件?
我已经看过几个外部程序,但肯定在Visual Studio中必须有一种方法 - 它是否适用于MS .net dll?
在.NET框架中,您可以创建一个.EXE将从命令行运行的单个文件,而无需任何额外的配置文件(如果使用ILMerge,则可以将所有.DLL引用放入1个.EXE程序集中).
我正在尝试使用.NET Core来完成同样的事情,但到目前为止还没有成功.即使是Hello World没有依赖关系的最简单的应用程序也需要有一个命名的文件<MyApp>.runtimeconfig.json才能运行dotnet.exe.
dotnet F:\temp\MyApp.dll
Run Code Online (Sandbox Code Playgroud)
内容<MyApp>.runtimeconfig.json如下:
{
"runtimeOptions": {
"framework": {
"name": "Microsoft.NETCore.App",
"version": "1.1.1"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有与此文件夹相同的配置文件.DLL,我会收到以下错误:
A fatal error was encountered. The library 'hostpolicy.dll' required to
execute the application was not found in 'F:\temp'.
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法改变应用程序,所以它不需要这个配置文件存在,所以这些信息的默认值是在编译内,.DLL但可以通过添加配置文件来覆盖?
注意:如果平台具有正确版本的.NET Core,我还要确保它"正常工作"而不管它上面安装的平台.
我试图获得一个流畅的用户体验,运行一些有时很有用的实用程序,但很少需要.因为它似乎没有可以使用相同的.DLL是从客户端应用程序中引用作为控制台应用程序,未来最好的事情是有一个单一的文件是可以下载,没有任何依赖性运行.
例如,在Java中,您只需.jar在任何支持的平台上下载文件并运行:
java <package>.jar <namespace>.SomeClass [args]
Run Code Online (Sandbox Code Playgroud)
并且它将"正常工作"而没有任何额外的文件.如何使用.NET Core获得类似的用户体验?
简而言之,我想尽量避免"首先解压缩到目录"的额外步骤......
.net c# console-application command-line-interface .net-core
我正在使用一个使用iTextSharp.dll和WebCam_Capture.dll的C#程序.当我构建程序时,它会在调试文件夹中创建可执行文件,并且它还会按预期将这两个dll复制到调试文件夹中.我想将它们合并为一个可执行文件,但是我失败了.这两个库在解决方案资源管理器中的引用中可见.我还将它们添加为资源.可执行文件大小变得更大,等于三个文件的总和,但是可执行文件仍然需要在其目录中使用这些库...我使用资源文件的"构建操作"属性但没有更改.我也试过ILmerge,但它给了我一个错误.所以我该怎么做?
更新:这是我从ILmerge得到的:
An exception occurred during merging:
Unresolved assembly reference not allowed: System.Core.
at System.Compiler.Ir2md.GetAssemblyRefIndex(AssemblyNode assembly)
at System.Compiler.Ir2md.GetTypeRefIndex(TypeNode type)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这只是一个Windows应用程序,一个表格将被填写并打印为pdf,并通过网络摄像头拍照(如果有的话).谢谢大家!
c# ×9
dll ×5
.net ×3
embed ×2
ilmerge ×2
.net-core ×1
64-bit ×1
assemblies ×1
c#-4.0 ×1
c++ ×1
dllimport ×1
executable ×1
fody ×1
itextsharp ×1
managed ×1
merge ×1
unmanaged ×1
visual-studio-2017-build-tools ×1
wpf ×1