通常,我的团队中的开发人员将创建一个新的Visual Studio项目,并在其本地计算机上的某处引用DLL(例如,C:\ mydlls\homersimpson\test.dll).然后,当我从源代码控制存储库获取项目时,我无法构建项目,因为我没有在我的机器上完全相同的位置引用的dll.
存储和引用共享库的最佳实践是什么?
鉴于以下内容:
string file = @"c:\somepath\somefile.dll";
Run Code Online (Sandbox Code Playgroud)
如何使用.NET查找该DLL的文件和产品版本号?
dll可以是本机的或托管的.
谢谢.
如何获得(可能)在GAC中注册的DLL的(物理)安装路径?此DLL是一个控件,可以托管在.Net应用程序以外的东西中(包括除VS之外的IDE ...).
当我使用System.Reflection.Assembly.GetExecutingAssembly().Location时,它给出了winnt\system32中GAC文件夹的路径 - 或者在VS中的设计模式中给出了VS IDE的路径.
我需要获得实际安装物理dll的路径 - 或者VS的bin/debug或(release)文件夹.
原因是我需要在此文件夹中获取一个XML文件,其配置设置既可以在设计模式下使用,也可以在运行时使用.
或者如何处理这种情况最好?我目前在设计模式中使用了一个可疑的网络位置...(不要认为ApplicationData文件夹会削减它(但是因为通过ClickOnce ans安装的.Net版本可以使用Clickonce数据)文件夹))
我们有一个由VS构建的(纯本机C++).DLL.作为客户端,我们有一些本机C++应用程序和围绕这个用C++/CLI编写的DLL的.Net-Wrapper.最后,有一些用C#编写的.Net-Wrapper客户端应用程序.
我的问题是native.dll必须以与.Net世界不同的方式分发,并且VS不会跟踪该DLL.因此,要让我的所有C#应用程序正常工作,我必须将其复制到每个可执行文件目录中,或者将其放在%PATH%中(我会避免在开发人员计算机上,因为他们可能希望使用不同版本的DLL启动不同的应用程序).如果存在引用Wrapper-DLL的UserControl,则会出现更大的问题:您必须将DLL复制到VS的目录或再次复制到%PATH%.但最坏的情况发生在我们的翻译工具上.该工具跟踪.Net-Assemblies并将它们打包到可以发送给外部翻译器的Translator-packages中.据我所知,没有办法将原生.DLL放入该包中!
所以我打算将原生DLL静态链接到.Net-Wrapper,这将解决我的问题.但对于我们的Native应用程序,此本机DLL仍必须是DLL.
所以我有两个选择:
无法找到引用的.dll时是否可以捕获异常?
例如,我有一个C#项目,引用了第三方dll; 如果找不到该dll,则抛出异常.例外是System.IO.FileNotFoundException,但我无法确定将其捕获的位置.以下代码似乎不起作用:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
// code goes here
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我做得对吗?
我的一个客户有一个小组,我正在开发基于Qt的客户端 - 服务器的东西,有很多有趣的小部件和套接字.
公司内的另一个团队希望使用基于QTcpSocket的客户端数据提供程序类的封装版本.(基本上它听起来像,提供从服务器到客户端显示器的数据)
但是,该组有一个巨大的应用程序,主要是使用MFC构建的,这根本不会很快改变.基于Qt的DLL也是延迟加载的,因此在某些配置中可以在没有此功能的情况下部署它.
我有它的工作,但它有点hacky.这是我目前的解决方案:
DLL包装器类构造函数调用QCoreApplication :: instance()以查看它是否为NULL.如果它为NULL,则假定它在非Qt应用程序中,并创建它自己的QCoreApplication实例:
if (QCoreApplication::instance() == NULL)
{
int argc = 1;
char* argv[] = { "dummy.exe", NULL };
d->_app = new QCoreApplication(argc, argv); // safe?
}
else
d->_app = NULL;
Run Code Online (Sandbox Code Playgroud)
然后它将设置一个Windows计时器,偶尔调用processEvents():
if (eventTimerInterval > 0)
{
// STATE: start a timer to occasionally process the Qt events in the event queue
SetTimer(NULL, (UINT_PTR)this, eventTimerInterval, CDatabaseLayer_TimerCallback);
}
Run Code Online (Sandbox Code Playgroud)
回调只是使用timerID作为指向类实例的指针来调用processEvents()函数.SetTimer()文档说当HWND为NULL时它会忽略timerID,所以这看起来完全有效.
VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
((BLAHBLAH*)idEvent)->processEvents(); // basically just …
Run Code Online (Sandbox Code Playgroud) 由于动态链接库必须在运行时解析,静态链接的可执行文件是否比动态链接的可执行文件更快?
有没有软件可以做到这一点?我没有在互联网上找到任何有用的信息,所以我在这里问.
我升级到PHP 5.3,并注意到缺少php_mssql.dll.谷歌搜索后,似乎5.3已经放弃了对mssql的支持.所以我从微软下载了驱动程序,但我似乎无法让它工作.
我在窗户上.在解压缩PHP 5.3的ext目录中的文件后,我需要做什么?
有没有人通过运行/附加到64位应用程序来成功调试64位dll?我有应用程序和DLL的Delphi代码.我可以用32位和64位调试应用程序.我也可以通过使用Run- > Parameters来调试32位dll 来选择32位版本的应用程序.
但是,我似乎无法通过运行64位应用程序调试我的64位DLL,有没有人让这个工作?
dll ×10
c# ×4
.net ×2
linker ×2
64-bit ×1
asp.net ×1
c++ ×1
debugging ×1
delphi ×1
delphi-xe2 ×1
file ×1
gac ×1
mfc ×1
performance ×1
php ×1
qt ×1
sql-server ×1
versioning ×1