我有一个.dll试图作为资源嵌入可执行文件中。以下两个问题会有所帮助,但不是完整的帮助:
这似乎不符合书面要求。args.Name不能照原样使用,但即使已修复,程序仍会抱怨缺少.dll,表明程序集未正确加载。
以及以下答案之一的链接:
http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/
但是,我的项目中没有任何形式的“ App.xaml *”文件-我没有使用WPF;我正在为自己的可执行文件使用WinForms(由于可执行文件的性质,更改并不是真正的选择)。
因此,我正在寻找一套完整的说明,以将类库作为资源嵌入可执行文件中,并从资源中加载.dll,而无需在嵌入式资源外部添加.dll文件。
例如,将一个“ App.xaml”文件简单地添加到WinForms项目中是否可行,或者是否存在我不知道的负面交互作用?
谢谢。
编辑:这是我目前正在使用的:
/// <summary>
/// Stores the very few things that need to be global.
/// </summary>
static class AssemblyResolver
{
/// <summary>
/// Call in the static constructor of the startup class.
/// </summary>
public static void Initialize( )
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler( Resolver ) ;
}
/// <summary>
/// Use this to resolve assemblies.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
public …Run Code Online (Sandbox Code Playgroud) 我有一个需要在运行时访问的文件,我已将其包含在我的项目中并将其设置为嵌入式资源(它实际上是一个源文件,我将扩展名更改为 .cs.txt 以绕过 VS 尝试编译它.这应该不重要,但我无论如何都会提到它以防万一)。当我尝试获取文件时
var assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream(resourceName);
Run Code Online (Sandbox Code Playgroud)
我得到一个空值。我已确保使用 Namespace.Folder.Filename 表示法,但这没有帮助。看来该文件实际上不存在,因为当我打电话时
assembly.GetManifestResourceNames();
Run Code Online (Sandbox Code Playgroud)
我得到一个空字符串数组。知道会发生什么情况吗?
我试图在安装过程中在Inno Setup脚本中使用自定义DLL。我编写了一个非常简单的函数,该函数基本上使用MySQL .NET连接器检查MySQL数据库的连接字符串(目标服务器上没有MySQL客户端)。此导出函数的代码为:
public class DbChecker
{
[DllExport("CheckConnexion", CallingConvention.StdCall)]
public static int CheckConnexion([MarshalAs(UnmanagedType.LPStr)] string connexionString)
{
int success;
try
{
MySqlConnection connection = new MySqlConnection(connexionString);
connection.Open();
connection.Close();
success = 0;
}
catch (Exception)
{
success = 1;
}
return success;
}
}
Run Code Online (Sandbox Code Playgroud)
该函数以这种方式导入Inno Setup中:
[Files]
Source: "..\..\MyDll\bin\x86\Release\*"; Flags: dontcopy;
Run Code Online (Sandbox Code Playgroud)
和
[Code]
function CheckConnexion(connexionString: AnsiString): Integer;
external 'CheckConnexion@files:MyDll.dll,MySql.Data.dll stdcall setuponly loadwithalteredsearchpath';`
Run Code Online (Sandbox Code Playgroud)
问题是安装程序在运行时引发异常:
运行时错误(位于53:207):
外部异常E0434352。
我认为我必须使用files前缀,因为在将NextButtonClick文件复制到{app}目录之前,在事件处理程序中调用了该函数。
两者MyDll.dll和MySql.Data.dll都{tmp}在运行时正确提取到目录中。
我尝试了带有和不loadwithalteredsearchpath带有标志的结果相同。 …
我在innosetup安装脚本中导入C++ DLL.DLL代码如下:
void __stdcall SetFbParam(char *dbFileName,char *dbTableName,char *dbParamName,char *dbParamValue){
//of no use here and doesn't change anything}
Run Code Online (Sandbox Code Playgroud)
在Innosetup中,我使用导入它
procedure FBset(dbFileName,dbTableName,dbParamName,dbParamValue: String;);
Run Code Online (Sandbox Code Playgroud)
external 'SetFbParam@files:MyDll.dll stdcall setuponly';
但是,我总是启动安装程序的过程中得到一个运行时错误,说这不能导入我的DLL.我尝试了各种调用约定,但总是失败.如果它是任何重要的,我在(安装程序请求权标高和崩溃后),运行Win7的X64与UAC.
确切的消息是:
错误
运行时错误(在-1:0):
无法导入
DLL:C:\ Users\Nevod\AppData\Local\Temp\is-6LOEC.tmp\MyDll.dll
dll就在那里.
谢谢!