我正在使用EmguCV进行项目,当我们的程序运行时,它需要一些像"cxcore.dll"等dll(或者它会抛出运行时异常).目前,我将文件放在输出文件夹的根目录中(在Visual Studio的文件属性中选择"始终复制").
然而它看起来有点凌乱,只有10个不同的dll.有没有我可以将它移动到输出文件夹中的子文件夹,它仍然会找到它.
我试图弄清楚当你动态生成程序集时,是否有可能引用先前动态生成的程序集中的类型.
例如:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
CodeDomProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results = provider.CompileAssemblyFromSource(parameters, @"
namespace Dynamic
{
public class A
{
}
}
");
Assembly assem = results.CompiledAssembly;
CodeDomProvider provider2 = new CSharpCodeProvider();
CompilerParameters parameters2 = new CompilerParameters();
parameters2.ReferencedAssemblies.Add(assem.FullName);
parameters2.GenerateInMemory = true;
CompilerResults results2 = provider2.CompileAssemblyFromSource(parameters2, @"
namespace Dynamic
{
public class B : A
{
}
}
");
if (results2.Errors.HasErrors)
{
foreach (CompilerError error in …Run Code Online (Sandbox Code Playgroud) 我正在测试MVC HTML帮助程序中的代码,在尝试获取应用程序路径时会抛出错误:
//appropriate code that uses System.IO.Path to get directory that results in:
string path = "~\\Views\\directory\\subdirectory\\fileName.cshtml";
htmlHelper.Partial(path, model, viewData); //exception thrown here
Run Code Online (Sandbox Code Playgroud)
引发的异常是
System.Web.HttpException:应用程序相对虚拟路径'〜/ Views/directory/subdirectory/fileName.cshtml'不能成为绝对路径,因为应用程序的路径未知.
遵循如何在测试HtmlHelper时解决图像路径问题的建议?
我假装(使用Moq):
Request.Url 返回一个字符串Request.RawUrl 返回一个字符串Request.ApplicationPath 返回一个字符串Request.ServerVariables 返回null NameValueCollectionResponse.ApplyAppPathModifier(string virtualPath) 返回一个字符串还需要什么才能允许此代码在单元测试运行的上下文中运行?
或者
我应该采取什么其他方法来渲染动态构建的字符串上的部分视图?
我试图实现基于的某些程序集的动态加载Environment.Is64BitProcess.
这基本上是这样的:
AppDomain.AssemblyResolve事件在事件处理程序从CPU类型相关的子路径加载程序集:
private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
// args.Name is the display name of an assembly, e.g.:
// MyAssembly, Version=5.0.0.0, Culture=neutral, PublicKeyToken=abcdefghijklmn
if(!args.Name.Contains("MyAssembly"))
return null;
var path = Path.Combine(GetCpuTypeDependentPath(), "MyAssembly.dll");
return Assembly.LoadFrom(path);
}
Run Code Online (Sandbox Code Playgroud)现在,这有问题,它没有检查加载的程序集的版本,publicKeyToken等.
我现在要做的就是致电Assembly.Load并简单地提供额外的探测路径.我知道这不起作用,因为没有这样的过载.还有其他方法可以实现我的目标吗?
我想暂时将目录添加到DLL搜索路径 - 在Windows 7下有正确的方法吗?
脚本
我有一个C#应用程序,我们称之为WonderApp.
WonderApp需要调用位于的C++ DLL C:\MyPath.因此,作为WonderApp的一部分Program.Main(),我添加了以下命令:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
Run Code Online (Sandbox Code Playgroud)
根据这篇文章,添加一个目录PATH也应该将它添加到目录搜索DLL.
该解决方案在Windows XP中运行良好:如果我将目录添加到PATH,则加载DLL并且程序运行正常.如果我不添加目录,则DLL不会加载,失败并显示"未找到"错误.
但是,这不适用于Windows 7.
所以我想,让我们试试吧SetDllDirectory().像这样:
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
Run Code Online (Sandbox Code Playgroud)
后来:
bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
Run Code Online (Sandbox Code Playgroud)
的价值success是true,但DLL仍然不能加载.
最后,如果我在运行应用程序之前手动设置PATH为包含C:\MyPath- 它一切正常!DLL加载,运行得很好.
所以,要重新迭代:
是否有正确的方法将目录临时添加到Windows 7下的DLL搜索路径?
更新:使用Process Explorer,我检查了应用程序的运行时环境,"C:\ MyPath"确实在PATH!此外,我看到它Helper.dll位于打开句柄列表中(作为DLL,而不仅仅是文件) - 它仍然声称没有找到它.
我正在开发一个引用并使用来自某个供应商的某些第三方程序集的应用程序; 在开发框中我在源代码树的参考文件夹中有这3个程序集,我可以引用它们并构建应用程序,应用程序构建但不运行,因为没有安装整个服务器应用程序,但这很好.
在我想要复制此自定义应用程序并运行我引用的所有程序集的服务器上的文件夹类似于:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
Run Code Online (Sandbox Code Playgroud)
如果我在该文件夹中复制我的小可执行文件并运行它,它可以正常工作,但如果我把我的.exe放在一个更合适的文件夹中,就像我想要的那样:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为它无法解析这些程序集.
我知道我可以在app.config中使用探测来指定我的exe必须查找引用的文件夹,但imy情况下程序集不在子文件夹中,更多在完全不同的位置.
我不想复制我的应用程序文件夹中的所有供应商程序集,我不能只放在那里我引用的3个,因为他们也加载其他程序集,除非我拥有所有这些(很多......),它不会工作.
我没有做任何特别的事情,没有创建应用程序域而不是通过反射加载程序集,只是希望CLR在应用程序启动或执行时需要解析引用.
谢谢.
编辑:这里是最终的工作代码
static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Logger logger = new Logger();
try
{
string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"];
Assembly MyAssembly = null;
string strTempAssmbPath = string.Empty;
Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
AssemblyName myAssemblyName = Array.Find<AssemblyName>(arrReferencedAssmbNames, a => a.Name == args.Name);
if (myAssemblyName != null)
{
MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase);
}
else
{
strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
if (!string.IsNullOrEmpty(strTempAssmbPath))
{
if (File.Exists(strTempAssmbPath))
{
logger.Information("Assembly …Run Code Online (Sandbox Code Playgroud) 我试图使用ClosedXML在应用程序中生成excel文档,但是当我尝试运行它时,我收到一个无法加载文件或程序集服务器错误.
Could not load file or assembly 'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)
我已经看到了几个解决方案,包括在其属性中更改.dll的'Copy Local'值并将程序集直接添加到web.config.
我正在使用Visual Studios 2010,并且dll属性不包含"复制本地"条目.然后,当我在Web配置中输入以下程序集时,我仍然收到相同的服务器错误消息.我从提供的错误消息中获得了程序集.
<add assembly="ClosedXML, Version=0.76.0.0, Culture=neutral, PublicKeyToken=fd1eb21b62ae805b"/>
Run Code Online (Sandbox Code Playgroud) 如何告诉我的.NET应用程序在哪里查找所需的特定程序集(除了GAC或运行应用程序的文件夹)?例如,我想将一个程序集放在用户的Temp文件夹中,让我的应用程序知道引用的Assembly在temp文件夹中.
谢谢
我有一个C#应用程序,它与一些硬件(USB设备)连接,如下所示:
C# application -> intermediate DLL -> hardware DLL -> hardware.中间DLL和硬件DLL随USB设备一起提供,因此我无法控制它们.
该中间DLL是唯一我需要它这在VS的项目包括,因为这就是我所说的.然后硬件DLL位于同一目录中,因此必须自动找到.
现在,使用不同的硬件DLL发布了新版本的硬件设备.旧DLL与新硬件不兼容,新DLL与旧硬件不兼容.
如何使我的应用程序与两个硬件一起工作?我想我需要根据需要加载和卸载每个DLL?
c# ×8
.net ×3
dll ×2
asp.net ×1
asp.net-mvc ×1
assemblies ×1
closedxml ×1
clr ×1
dependencies ×1
dllimport ×1
dynamic ×1
mocking ×1
reference ×1
unit-testing ×1
windows-7 ×1