小编Xha*_*lie的帖子

全局程序集缓存中的Microsoft.SqlServer.Types.dll?

我目前正在努力解决由其Microsoft.SqlServer.Types及其相关的非托管库引起的部署问题,SqlServerSpatial110.dll这两者都适用于Microsoft SQL Server 2012.问题很容易解决,只是典型的DLL缺失问题,但我试图决定处理这些依赖关系的完美方法.

首先,我必须声明我不同意手动部署任一库(通常通过将它们复制到项目的输出目录中,或者可疑地将其复制到System32自身中)的流行观点是正确的.Microsoft为这些文件提供可再发行的MSI安装程序,这些安装程序将这些文件放入系统位置.很明显,他们希望我们依赖于单独安装的可再发行组件,或者作为MSI本身内置的经过试验和测试的依赖机制的一部分.

在发布时,可以从以下网址下载这些可再发行组件的最新版本:http://www.microsoft.com/en-gb/download/details.aspx?id = 43339

因为SqlServerSpatial110.dll,似乎没有任何问题.MSI安装程序(特定于平台)将文件放入任一Windows\System32Windows\SysWOW64适当的一切,一切都很好.

托管包装器库Microsoft.SqlServer.Types.dll更令人困惑.

在我看来,该文件被放入全局程序集缓存 - 运行MSI后,在我的机器上,我可以看到它位于,C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll该文件具有正确的版本和修改日期.

奇怪的是,我无法在Visual Studio的参考浏览器或Windows资源管理器中直接看到它 - 只有我在Mysicsoft的老式文件系统搜索工具中才能看到它.为什么我看不到它?

由于该文件几乎在GAC中,我猜测引用它的项目应该制作它的本地副本 - 它们应该依赖它在目标系统上.我测试了这个假设并且它有效:

  1. Microsoft.SqlServer.Types.dll从其位置手动复制C:\Windows\assembly\GAC_MSIL
  2. 添加对副本的引用.
  3. 确保引用已Copy Local设置为False
  4. 构建项目并确保Microsoft.SqlServer.Types.dll输出中绝对不存在.
  5. 测试项目...... 没问题!

因此,如果可以在运行时从GAC解析程序集以满足此依赖性,那么为什么在添加引用时它不会显示在引用浏览器中?为什么我必须将其从GAC中复制出来并参考副本?

在我看来,理想的工作流程是这样的:

  1. 在开发计算机上安装可再发行的MSI.
  2. 如果您的产品是通过MSI部署的,或者如果您正在使用"xcopy"部署手动安装产品,请确保在目标计算机上安装可再发行组件,方法是将其列为MSI依赖项.
  3. 参考Microsoft.SqlServer.Types使用参考浏览器就像任何框架库从GAC.(默认Copy Local设置为False.) …

sql-server dll gac spatial

15
推荐指数
1
解决办法
2万
查看次数

IPv6:在侦听连接时,`::'是否等同于'0.0.0.0'?

当我检查的输出IPGlobalProperties.GetActiveTcpListeners(),我看到听众的0.0.0.0以及::.

我相信在端口上0.0.0.0监听相当于监听任何网络适配器上的端口,至少我对Windows套接字API的记忆就是这样.

对我而言,这::也意味着在IPv6的用语中具有相同的意义,因此侦听器[::]:49156将侦听49156所有IPv6网络适配器上的[::1]:1434端口1434,其中只有IPv6环回适配器上的端口.

它是否正确?

我假设IPv6侦听端点仅适用于IPv6适配器.也就是说,如果适配器只有一个IPv4地址,那么49156侦听器就不会收到与该端口的连接[::]:49156

另外,有人注意到MSDN文章GetActiveTcpListeners()错误地声明返回的对象"包括除了 Listen状态以外的所有TCP状态的侦听器."?

sockets ipv6

13
推荐指数
3
解决办法
2万
查看次数

C++ Move Semantics - 包装旧版C API

我正在使用传统的C API,在这种API下获取一些资源是昂贵的,并且释放该资源绝对是至关重要的.我正在使用C++ 14,我想创建一个类来管理这些资源.这是事物的基本骨架......

class Thing
{
private:
    void* _legacy;

public:
    void Operation1(...);
    int Operation2(...);
    string Operation3(...);

private:
    Thing(void* legacy) :
        _legacy(legacy)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

这不是单身模式.没有什么是静态的,可能有很多Thing实例,都在管理自己的遗留资源.此外,这不仅仅是一个智能指针.包裹的指针,_legacy是私有的,所有操作都是通过一些公共实例函数公开的,这些函数隐藏了消费者的遗留API.

构造函数是私有的,因为实例将从实际获取资源Thing的静态工厂或命名构造函数返回.这是对该工厂的廉价模仿,使用malloc()作为代码的占位符来调用遗留API ...

public:
    static Thing Acquire()
    {
        // Do many things to acquire the thing via the legacy API
        void* legacy = malloc(16);

        // Return a constructed thing
        return Thing(legacy);
    }
Run Code Online (Sandbox Code Playgroud)

这是析构函数,它负责释放遗留资源,同样,free()它只是一个占位符......

    ~Thing() noexcept
    {
        if (nullptr != _legacy)
        {
            // Do many …
Run Code Online (Sandbox Code Playgroud)

c++ constructor move c++11 c++14

11
推荐指数
2
解决办法
525
查看次数

处理WCF代理的正确方法是什么?

我一直在努力与WCF Proxies.处理WCF代理的正确方法是什么?答案并非微不足道.

System.ServiceModel.ClientBase违反了Microsoft自己的Dispose-pattern

System.ServiceModel.ClientBase<TChannel> 确实实现了,IDisposable所以必须假设它应该在using-block中处理或使用.这些是一次性用品的最佳实践.但是,实现是明确的,因此必须明确地将ClientBase实例IDisposable强制转换为使问题蒙上阴影.

混乱的最大来源,然而,就是呼吁Dispose()ClientBase产生故障的情况下,甚至指责,因为他们从来没有摆在首位开渠道,将导致引发异常.这不可避免地意味着,当堆栈展开时,解释错误的有意义的异常会立即丢失,using范围结束并Dispose()抛出无意义的异常,表示您无法处置故障通道.

上述行为是对dispose模式的诅咒,该模式声明对象必须容忍多个显式调用Dispose().(请参阅http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx ,") 允许Dispose(bool)多次调用该方法.该方法可能选择不执行任何操作第一次通话后. ")

随着控制反转的出现,这种糟糕的实现成为一个真正的问题.IOC容器(特别是Ninject)检测IDisposable接口并Dispose()在注入范围结束时显式调用激活的实例.

解决方案:代理ClientBase和Intercept调用Dispose()

我的解决方案是ClientBase通过子类化代理System.Runtime.Remoting.Proxies.RealProxy并劫持或拦截调用Dispose().我的第一个替换Dispose()是这样的:

if (_client.State == CommunicationState.Faulted) _client.Abort();
else ((IDisposable)_client).Dispose();
Run Code Online (Sandbox Code Playgroud)

(注意,它_client是对代理目标的类型引用.)

NetTcpBinding的问题

我认为这最初已经钉了它,但后来我发现生产中存在一个问题:在某些非常难以复制的情况下,我发现使用a的频道NetTcpBinding在没有故障的情况下没有正确关闭,即使Dispose被调用_client.

我有一个ASP.NET MVC应用程序使用我的代理实现连接到NetTcpBinding本地网络上的WCF服务,该服务托管在只有一个节点的服务集群上的Windows NT服务中.当我对MVC应用程序进行负载测试时,WCF服务上的某些端点(使用端口共享)会在一段时间后停止响应.

我努力重现这一点:在两台开发人员的机器之间运行在LAN上的相同组件运行良好; 锤击真正的WCF端点(在登台服务集群上运行)的控制台应用程序,其中包含许多进程和每个工作中的许多线程; 在登台服务器上配置MVC应用程序以连接到负载下工作的开发人员机器上的端点; 在开发人员的计算机上运行MVC应用程序并连接到暂存的WCF端点.然而,最后一种情况仅适用于IIS …

asp.net-mvc wcf dispose nettcpbinding realproxy

7
推荐指数
1
解决办法
1287
查看次数

如何测试shared_ptr是空还是什么都没有

C++ std::shared_ptr<..>可能为,也可能为null.这两个概念都存在,并且它们相同.此外,这两种情况之间并不总是如此.

后一种情况很容易检测,因为operator bool提供了精确的测试.根据文档,它"检查是否*this存储非空指针,即是否get() != nullptr."

是否对前一种情况进行了测试,事情是空的

我对此的使用非常简单.我有一个具有静态工厂方法的类.静态工厂方法内部是shared_ptr类的实例的静态本地,初始化为nullptr.对该工厂方法的第一次调用构造了一个类的实例,并shared_ptr在返回它的副本之前初始化静态local - 这是由a守护的mutex.这shared_ptr可以由任何东西保存,复制和传递,可以通过对静态工厂的额外调用来获取更多副本,并且最后,当所有副本被破坏时,shared_ptr删除器会破坏实例.

实例本身是使用遗留的C API创建和破坏的,由我的类包装,虽然这些实例旨在作为单例共享,但它们也需要在不再需要时进行清理 - 与单例不同.

目前,我正在使用空检查来决定是shared_ptr应该初始化静态本地还是仅复制静态本地.我担心这个测试无法检测需要重新初始化的情况 - 例如,如果某些事情在所有先前用户放弃其引用并且共享实例被删除之后的某个时间尝试获取实例.

或者shared_ptr,nullptr如果引用计数降为零并且调用了删除器,则重置为是吗?也适用于自定义删除者?

同样相关:C++中的空和空std :: shared_ptr有什么区别?

c++ shared-ptr

6
推荐指数
1
解决办法
9547
查看次数

用 Rust 结构驯服终生传染

我试图在Ruststruct中定义一个, ,它包含 type 的一个成员,该类型本身在整个生命周期内是通用的:async_executor::LocalExecutor'a

pub struct LocalExecutor<'a> {
    inner: ......<Executor<'a>>,
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

显然,我自己的结构现在在整个生命周期中'a必须是通用的, ,这对它本身来说没有任何意义——生命周期是 的一个细节async_executor::LocalExecutor

#[cfg(all(test, not(target = "wasm32")))]
struct MockThing<'a> {
    executor: async_executor::LocalExecutor<'a>,
}
Run Code Online (Sandbox Code Playgroud)

我的结构仅在构建单元测试时才存在,其中我需要一个模拟的单线程执行器来运行async代码。问题在于:我的结构的唯一使用者#[cfg(...)]在内部使用条件编译来

  1. 编译单元测试时使用我的模拟(而不是 WebAssembly)
  2. 或者为 WebAssembly 编译时的一种实际实现
  3. 或另一个实际的实现,否则。

这是通过条件编译来完成的,以确保使用者本身不是不必要的泛型,这会污染其公共 API,并将传染性泛型的问题推向所有使用它的事物——大量的事物。条件编译提供了某种编译时鸭子类型,并且由于条件编译仅存在于一个位置,因此其他人都不需要了解实现细节 - 正如它应该的那样。

实现 2 和 3 都不需要通用生命周期,但是,因为模拟一 (1) 必须是通用的'a,所以我现在必须在整个代码库中使所有内容在某个生命周期内通用,'a'!(并且热衷于PhantomData阻止编译器抱怨这'a是毫无意义的,大多数时候确实如此。)

有没有什么方法可以让我定义我的模拟结构而不会遇到这个问题?'_如果我可以在成员定义中使用它会非常方便,例如......

#[cfg(test)]
struct MockThing {
    executor: …
Run Code Online (Sandbox Code Playgroud)

generics lifetime rust

6
推荐指数
1
解决办法
282
查看次数

在WinNT.h中,为什么STANDARD_RIGHTS_READ、...WRITE和...EXECUTE定义为相同?

我正在做一些 Win32 互操作。在搜索标题、仔细阅读 MSDN 并在快乐的泡沫中定义常量和 dll 导入时,我在 WinNT.h 中发现了一些奇怪的行(我的版本中的第 6486-6488 行...呃...7.1a,我思考)

#define STANDARD_RIGHTS_READ             (READ_CONTROL)
#define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
#define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)
Run Code Online (Sandbox Code Playgroud)

我一边喝着茶,一边盯着它看了一会儿,想知道为什么这三个常量都被定义为相同的值。

这很有趣。有人知道吗?

c++ winapi

5
推荐指数
1
解决办法
1259
查看次数

如何使用“borrow::Borrow&lt;…&gt;”接受任何“借用”特征的内容?

Rust 特征文档core::convert::AsRef

\n
\n

\xe2\x80\xa6Borrow有一个针对任何T,可用于接受引用或值。

\n
\n

然后它继续链接到core::borrow::Borrow特征

\n

事实上,它可以用来编写可以通过值或通过引用接受参数的通用代码 \xe2\x80\x93 它表示任何可以借用为&Tand 的概念,因为T可以借用为&T,这个简单的例子可以工作完美:

\n
fn report_by_either<T: Borrow<i32>>(either: T) {\n    let x: i32 = *either.borrow();\n    println!("x = {}", x);\n}\n\xe2\x8b\xae\n\nreport_by_either(5); // x = 5\nreport_by_either(&6); // x = 6\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果希望具体地在更复杂的场景中使用Borrow<\xe2\x80\xa6>\xe2\x80\x94 该怎么办:在具有通用约束的通用代码中。不是表示任何借用为 的&T概念,而是如何另外表达这样的约束:T,而是如何另外表达实现特征的

\n

最近,当我试图解决Rust \ 的范围并不全部实现的事实时,我想到了一个非常简单的例子Copy这一事实时,我想到了一个非常简单的例子。

\n

考虑这个函数,它接受任何可以提供的东西RangeBounds<i32> …

generics rust borrow-checker

5
推荐指数
1
解决办法
341
查看次数

仅用于消息循环的WPF窗口句柄

我正在编写一个WPF应用程序,它将在系统托盘中放置一个图标,作为练习,我想在不依赖System.Windows.Forms和使用它NotifyIconNativeWindow类的情况下执行此操作.

这很容易 - Shell_NotifyIcon从C#调用并不难 - 事实上,我已经成功完成了我的任务.

作为这项工作的一部分,我不得不创建一个窗口句柄,其唯一目的是从系统托盘接收消息.我创建本机窗口如下:

// Create a 'Native' window
_hwndSource = new HwndSource(0, 0, 0, 0, 0, 0, 0, null, parentHandle);
_hwndSource.AddHook(WndProc);
Run Code Online (Sandbox Code Playgroud)

消息循环被挂钩AddHook(),消息在一个如下所示的函数中处理:

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    // Handle windows messages in this...
}
Run Code Online (Sandbox Code Playgroud)

而且,最后,当需要销毁这个东西时,我会通过发布WM_CLOSE消息并处理它来关闭窗口HwndSource.

if (null != _hwndSource)
{
    UnsafeNativeMethods.PostMessage(_hwndSource.Handle, WindowMessage.WM_CLOSE, 0, 0);
    _hwndSource.Dispose();
    _hwndSource = null;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:构造函数的前三个参数HwndSource分别是本机Win32窗口的类样式,样式和扩展样式.对于只能用作窗口消息目标的不可见窗口,它们应该是什么?

我的默认值为零,零和......呃..零可以工作,但我使用Spy …

c# windows wpf winapi

4
推荐指数
1
解决办法
1193
查看次数

性能计数器实例名称与进程名称

我正在连接到该Process类别中的各种性能计数器.我使用以下c#方法来确定获取计数器时要使用的实例名称:

private const string _categoryName = "Process";
private const string _processIdCounter = "ID Process";

public static bool TryGetInstanceName(Process process, out string instanceName)
{
    PerformanceCounterCategory processCategory = new PerformanceCounterCategory(_categoryName);
    string[] instanceNames = processCategory.GetInstanceNames();
    foreach (string name in instanceNames)
    {
        using (PerformanceCounter processIdCounter = new PerformanceCounter(_categoryName, _processIdCounter, name, true))
        {
            if (process.Id == (int)processIdCounter.RawValue)
            {
                instanceName = name;
                return true;
            }
        }
    }

    instanceName = null;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

现在,我注意到返回的实例名称通常与值相匹配Process.ProcessName.

实例名称和进程名称如何相关?

我问,因为我想简化foreach例程中的循环,这样我就不必获取ID Process …

c# process performancecounter

4
推荐指数
1
解决办法
3847
查看次数